LocalDateTime 以数组格式表示

Pra*_*ngh 3 java spring-boot objectmapper jackson2

我在 Java 8 中使用 spring boot 2.2.6 和 Jackson 2.10.3。我在整个项目中使用 localdatetime 对象。Jackson 无法正确解析 LocalDateTime(或者可能是默认格式)并以如下数组格式在 json 响应中发送日期

        "createdDate": [
            2020,
            8,
            31,
            0,
            0,
            0,
            80000000
        ]
Run Code Online (Sandbox Code Playgroud)

Spring Boot中的JSON Java 8 LocalDateTime 格式所述,Spring Boot 2 已经在类路径上默认设置了 jackson-datatype-jsr310:2.10.3。我希望日期在整个项目中以 json 表示为 2020-03-31:00。第一个解决方案在上面的链接中不起作用。在那之后,我尝试了 @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;
    }
Run Code Online (Sandbox Code Playgroud)

还尝试自定义 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;
    }
Run Code Online (Sandbox Code Playgroud)

也尝试过 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")));
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器

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

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

}
Run Code Online (Sandbox Code Playgroud)

我可以在全球范围内做些什么,所以项目中的每个日期都将被序列化为字符串格式,如 2020-09-01 ?

任何建议都会有所帮助。

Pra*_*ngh 6

罪魁祸首是@EnableWebMVC。我的 cors 课程之一有@EnableWebMVC注释。这将禁用 spring boot 自动配置并覆盖映射器配置。这不会让您覆盖对象映射器的配置。通过删除@EnableMVC注释,现在可以正常工作了。在 SpringBoot2 中,我们不需要做任何与日期序列化相关的显式配置,它会自动解析“yyyy-mm-dd”格式的 java 8 日期。

  • 在迷失寻找答案后,感谢您的分享。效果非常好! (2认同)