LocalDateTime以数组格式表示

问题描述

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

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

JSON Java 8 LocalDateTime format in Spring Boot中所述,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;
    }

还尝试自定义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")));
        };
    }
}

Contoller

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

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

}

我在全局级别上能做些什么,所以项目中的每个日期都将像2020-09-01这样的字符串格式序列化?

任何建议都会有所帮助。

解决方法

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

,

创建一个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)));
    };
}

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...