本地日期时间以数组格式表示

6

我正在使用Spring Boot 2.2.6和Jackson 2.10.3,以及Java 8。在项目中,我一直在使用LocalDateTime对象。然而,Jackson不能正确地解析LocalDateTime(或者它的默认格式),并将日期作为数组格式发送到JSON响应中,类似于下面的格式:

        "createdDate": [
            2020,
            8,
            31,
            0,
            0,
            0,
            80000000
        ]

JSON Java 8 LocalDateTime format in Spring Boot所述,Spring Boot 2已默认在类路径上具有jackson-datatype-jsr310:2.10.3。我想让整个项目的日期以2020-03-31:00的形式表示为json。第一种解决方案在上面的链接中不起作用。之后,我尝试了@JsonSerialize注释,并且它有效,但我不想在每个类上应用它。因此,还尝试了覆盖对象映射器,但它没有起作用。
@Primary
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        SimpleModule module = new SimpleModule("my custom date serializer");
        module.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer());
        mapper.registerModule(module);
        return mapper;
    }

我也尝试自定义Jackson2ObjectMapperBuilder,但仍然有日期以数组格式显示。

@Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        SimpleModule module = new SimpleModule("my custom date serializer");
        module.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer());
        builder.modulesToInstall(modules)
        return builder;
    }

还尝试了使用Jackson2ObjectMapperBuilderCustomizer

@Configuration
public class JacksonConfiguration {

    @Primary
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
        return builder -> {
            builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        };
    }
}

控制器

@RestConroller
@RequestMapping("/user")
UserController {

    User getUser(){
        User user = new User()
        user.createdDate = LocalDateTime.now();
        return user;
    }

}

在全局范围内是否有任何措施可以使项目中的每个日期都以字符串格式进行序列化,例如2020-09-01?

任何建议都将非常有用。

3个回答

21

罪魁祸首是@EnableWebMVC。我的cors类中有一个@EnableWebMVC注释,这会禁用spring boot自动配置并覆盖映射器配置。这将不允许您覆盖对象映射器的配置。通过移除@EnableMVC注释,现在可以正常工作了。在SpringBoot2中,我们无需明确执行任何与日期序列化相关的配置,它将自动解析"yyyy-mm-dd"格式的java 8日期。


2
在寻找答案时迷失方向,感谢您的分享。非常有效! - Marcelo Rodrigo
如果我删除@EnableWebMVC,这会影响CORS配置吗? - Shivendra Singh
不,我不这么认为。 - Prabjot Singh

3
在用户模型的日期字段上使用以下Jackson注释:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")

这种方法解决了我的问题。我之前使用的是基于注释的属性配置。@JsonProperty @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime operationStart; - antonkronaj

1
创建一个Jackson2ObjectMapperBuilderCustomizer bean:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    return builder -> {
        builder.simpleDateFormat(dateTimeFormat);
        builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
        builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
    };
}

application.properties中添加属性spring.jackson.serialization.write_dates_as_timestamps=false,或者您也可以在Jackson2ObjectMapperBuilderCustomizer中以编程方式执行。

@PrabjotSingh,听起来你正在从Spring控制范围之外进行序列化。请发布您的序列化代码。 - Abhijit Sarkar
我已编辑了问题。添加了Jackson2ObjectMapperBuilderCustomizer代码和控制器代码。 - Prabjot Singh
仍然存在相同的问题,尝试使用属性文件和使用Java配置。 - Prabjot Singh
@PrabjotSingh 抱歉,我不知道还能怎样帮助你。请自己调试代码。 - Abhijit Sarkar
感谢您的帮助,我已经得到了答案。我已经发布了它。 - Prabjot Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接