SpringBoot,Hibernate和REST-JSON中的日期格式

时间:2018-08-13 08:52:22

标签: 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 Date rezerwacjaDataDo;
private Time rezerwacjaGodzOd;
private Time rezerwacjaGodzDo;

也是java.sql中的Date和java.sql中的Time

我的控制器:

@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”格式?

2 个答案:

答案 0 :(得分:3)

您应该做两件事

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

  • 您可以通过使用dateOfBirth

  • 注释您的@JsonFormat(pattern="yyyy-MM-dd")属性的getter方法来自定义格式

答案 1 :(得分:0)

休眠保持数据库中日期/时间对象的方式不同与使用这些对象的方式有关。

根据文档TimeDate的一个薄包装,它允许基础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