Spring Boot,在 REST 响应中将日期时间精度定义为毫秒

我创建了一个提供 REST API 的 Spring Web 应用程序。我正在使用 Spring Boot 2.x、Spring Data REST、Spring HATEOAS、Spring JPA、Hibernate 5.3、Mysql。


我也在使用 jackson-datatype-jsr310。


我在整个应用程序中使用 UTC 日期,并将 UTC 日期存储在 Mysql 中。


在我的豆日期中定义为:


    @NotNull

    @Column(nullable = false)

    private Instant validUntil;

一切正常,但是当 API 被使用时,日期会以这种格式返回:


"validUntil" : "2019-11-05T22:59:59.999999Z"

我想将应用程序中的每个日期时间截断为毫秒,因此日期应该是:


“有效直到”:“2019-11-05T22:59:59.999Z”


在我的 @Configuration 中,我使用自定义 JacksonModule:


    @Bean

    public Module customJacksonModule() {

        SimpleModule customJacksonModule = new SimpleModule();

        customJacksonModule.addSerializer(ConstraintViolationException.class, constraintViolationExceptionSerializer());

        customJacksonModule.addSerializer(ValidationException.class, validationExceptionSerializer());

        customJacksonModule.addSerializer(cloud.optix.server.exceptions.ValidationException.class, customValidationExceptionSerializer());  

        return customJacksonModule;

    }

我尝试了几种方法,但到目前为止没有一个有效:


1. Application.properties


我放入spring.jackson.serialization.write-date-timestamps-as-nanoseconds = false我的 application.propreties


2. 自定义对象映射器


我尝试更改 objectMapper 的设置。


@Autowired(required = true)

public void configureJackson(ObjectMapper jackson2ObjectMapper) {

    jackson2ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

    jackson2ObjectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);

}

3.删除@EnableHypermediaSupport


@EnableHypermediaSupport(type = {EnableHypermediaSupport.HypermediaType.HAL})

所有这些操作都没有改变将日期返回给客户端的方式。我想要一些建议来理解/调试为什么日期没有以正确的格式返回。


作为补充说明,我发现在com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializerBaseserialize() 方法中我既没有useNanosecondsproperty ,也没有 default formatter。但是 application.properties 中的属性spring.jackson.serialization.write-dates-as-timestamps会影响日期格式。

https://img.mukewang.com/65017a0d00014e3a15210944.jpg

有只小跳蛙
浏览 143回答 3
3回答

呼如林

您可以将 ObjectMapper 配置为在应用程序中使用特定的日期格式:jackson2ObjectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz"));

四季花海

你需要替换InstantSerializer杰克逊正在使用的东西。@Configurationpublic class JacksonConfig {    @Bean    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {        return builder -> builder.serializers(new CustomInstantSerializer());    }    private static class CustomInstantSerializer extends InstantSerializer {        private static final DateTimeFormatter UTC_DATE_FORMAT = DateTimeFormatter                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneOffset.UTC);        private CustomInstantSerializer() {            super(InstantSerializer.INSTANCE, null, UTC_DATE_FORMAT);        }    }}例如,您可以将JacksonConfig类放入项目的包中。config另外,如果不起作用,请检查 SpringBoot 是否真的可以找到它。在默认构造函数中设置断点InstantSerializer或在其中添加临时日志记录。

慕标5832272

您是否尝试过像下面这样注释 validUntil 字段@JsonFormat。@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")@NotNull@Column(nullable = false)private Instant validUntil;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java