【问题标题】:SpringBoot, Hibernate and REST - date format in JSONSpring Boot、Hibernate 和 REST - JSON 中的日期格式
【发布时间】:2019-01-19 23:01:05
【问题描述】:

我在 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”格式,而日期是 1535580000000 格式? 如何使日期为“yyyy-MM-dd”格式?

【问题讨论】:

    标签: json spring hibernate rest spring-boot


    【解决方案1】:

    你应该做两件事

    • 在您的 application.properties 中添加 spring.jackson.serialization.write-dates-as-timestamps:false 这将禁用将日期转换为时间戳,而是使用符合 ISO-8601 的格式

    • 您可以通过使用@JsonFormat(pattern="yyyy-MM-dd") 注释dateOfBirth 属性的getter 方法来自定义格式

    【讨论】:

      【解决方案2】:

      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));
              }
          }
      
      }
      

      另外(这是个人的事情),我建议使用普通的 Date 对象来存储日期,此外,将相应的字段注释为 @Temporal

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-19
        • 2016-09-19
        • 2015-05-20
        • 2015-05-18
        • 2015-05-15
        • 2019-08-10
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多