Я использую Spring boot 2.2.6 и Jackson 2.10.3 с Java 8. Я использую объекты localdatetime в своем проекте. Джексон не может правильно проанализировать LocalDateTime (или, возможно, это формат по умолчанию) и дату отправки в ответе json, как в формате массива, как показано ниже

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

Как описано в формате JSON Java 8 LocalDateTime в 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")));
        };
    }
}

< Сильный > регулятора,

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

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

}

Могу ли я что-нибудь сделать на глобальном уровне, чтобы каждая дата в проекте была сериализована в строковом формате, например, 2020-09-01?

Любое предложение будет полезно.

1
Prabjot Singh 1 Сен 2020 в 09:41

2 ответа

Лучший ответ

Виновником был @EnableWebMVC. Один из моих классов cors имел аннотацию @EnableWebMVC. Это отключало автоматическую конфигурацию весенней загрузки, а также отменяло конфигурацию маппера. Это не позволит вам переопределить конфигурацию сопоставителя объектов. После удаления аннотации @EnableMVC теперь все работает нормально. В SpringBoot2 нам не нужно выполнять какую-либо конфигурацию, явно связанную с сериализацией дат, он автоматически анализирует даты java 8 в формате «гггг-мм-дд» .

2
Prabjot Singh 2 Сен 2020 в 04:09