JSON格式的SpringBoot、Hibernate和REST-date格式

JSON格式的SpringBoot、Hibernate和REST-date格式,json,spring,hibernate,rest,spring-boot,Json,Spring,Hibernate,Rest,Spring Boot,我对REST项目(SpringBoot+Hibernate)中生成的JSON响应中的日期格式有问题 当我调用函数时,我得到了如下JSON: "rezerwacjaDataOd": 1535580000000, "rezerwacjaDataDo": 1535839200000, "rezerwacjaGodzOd": "14:00:00", "rezerwacjaGodzDo": "12:00:00" 我的实体: private Date rezerwacjaDataOd; private D

我对REST项目(SpringBoot+Hibernate)中生成的JSON响应中的日期格式有问题

当我调用函数时,我得到了如下JSON:

"rezerwacjaDataOd": 1535580000000,
"rezerwacjaDataDo": 1535839200000,
"rezerwacjaGodzOd": "14:00:00",
"rezerwacjaGodzDo": "12:00:00"
我的实体:

private Date rezerwacjaDataOd;
private Date rezerwacjaDataDo;
private Time rezerwacjaGodzOd;
private Time rezerwacjaGodzDo;
它是来自java.sql的日期,也是来自java.sql的时间

我的控制器:

@RestController
@CrossOrigin
@RequestMapping("api/rezerwacja")
@Api
public class RezerwacjaController {
...
  @GetMapping(value = "/getRezerwacjaById")
  public @ResponseBody
  Rezerwacja getRezerwacjaById(Integer id) {
      return rezDao.findOne(id);
  }
...
为什么时间是“12:00:00”格式,而日期是153558000000格式?
如何将日期设置为“yyyy-MM-dd”格式?

您应该做两件事

  • 添加
    spring.jackson.serialization.write dates as timestamp:false
    应用程序中。properties
    这将禁用将日期转换为时间戳的功能,而是使用符合ISO-8601的格式

  • 您可以使用
    @JsonFormat(pattern=“yyyy-MM-dd”)


    • 你应该做两件事

      • 添加
        spring.jackson.serialization.write dates as timestamp:false
        应用程序中。properties
        这将禁用将日期转换为时间戳的功能,而是使用符合ISO-8601的格式

      • 您可以使用
        @JsonFormat(pattern=“yyyy-MM-dd”)


      hibernate在数据库中持久化日期/时间对象的方式上的差异与这些对象的使用方式有关

      根据文档
      Time
      是一个围绕
      Date
      的薄包装,它允许底层JPA提供者使用您注意到的约定保存日期对象

      另一方面,您传入的
      Date
      对象直接转换为时间戳,并以这种方式保存

      在这两种情况下,您都可以检索有问题的值并序列化为所需的格式(ISO-8601是最好的)

      除了上面提到的解决方案之外,另一个解决方案是创建一个自定义序列化程序来实现这一点

      一个简单的实施方案是:

      public class Iso8601Serializer extends StdSerializer<Date> {
      
          private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
      
          public Iso8601Serializer() {
              this(null);
          }
      
          public Iso8601Serializer(Class clazz) {
              super(clazz);
          }
      
          @Override
          public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
          throws IOException {
              if (date == null) {
                  jsonGenerator.writeNull();
              } else {
                  jsonGenerator.writeString(DateFormatUtils.format(date, ISO_8601_FORMAT));
              }
          }
      
      }
      
      公共类ISO8601序列化程序扩展了StdSerializer{
      私有静态最终字符串ISO_8601_FORMAT=“yyyy-MM-dd'T'HH:MM:ss.SSSZ”;
      公共ISO8601序列化程序(){
      这个(空);
      }
      公共ISO8601系列化器(clazz类){
      超级(clazz);
      }
      @凌驾
      public void serialize(日期日期,JsonGenerator JsonGenerator,SerializerProvider SerializerProvider)
      抛出IOException{
      如果(日期==null){
      jsonggenerator.writeNull();
      }否则{
      jsonGenerator.writeString(DateFormatUtils.format(日期,ISO_8601_格式));
      }
      }
      }
      

      另外(这是个人的事情),我建议使用普通的
      Date
      对象来存储日期,并且进一步,将各自的字段注释为
      @Temporal

      hibernate在数据库中保存日期/时间对象的方式的不同与这些对象的使用方式有关

      根据文档
      Time
      是一个围绕
      Date
      的薄包装,它允许底层JPA提供者使用您注意到的约定保存日期对象

      另一方面,您传入的
      Date
      对象直接转换为时间戳,并以这种方式保存

      在这两种情况下,您都可以检索有问题的值并序列化为所需的格式(ISO-8601是最好的)

      除了上面提到的解决方案之外,另一个解决方案是创建一个自定义序列化程序来实现这一点

      一个简单的实施方案是:

      public class Iso8601Serializer extends StdSerializer<Date> {
      
          private static final String ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
      
          public Iso8601Serializer() {
              this(null);
          }
      
          public Iso8601Serializer(Class clazz) {
              super(clazz);
          }
      
          @Override
          public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
          throws IOException {
              if (date == null) {
                  jsonGenerator.writeNull();
              } else {
                  jsonGenerator.writeString(DateFormatUtils.format(date, ISO_8601_FORMAT));
              }
          }
      
      }
      
      公共类ISO8601序列化程序扩展了StdSerializer{
      私有静态最终字符串ISO_8601_FORMAT=“yyyy-MM-dd'T'HH:MM:ss.SSSZ”;
      公共ISO8601序列化程序(){
      这个(空);
      }
      公共ISO8601系列化器(clazz类){
      超级(clazz);
      }
      @凌驾
      public void serialize(日期日期,JsonGenerator JsonGenerator,SerializerProvider SerializerProvider)
      抛出IOException{
      如果(日期==null){
      jsonggenerator.writeNull();
      }否则{
      jsonGenerator.writeString(DateFormatUtils.format(日期,ISO_8601_格式));
      }
      }
      }
      
      另外(这是我个人的事情),我建议使用普通的
      Date
      对象来存储日期,并且将相应的字段注释为
      @Temporal