LocalDateTime direpresentasikan dalam format array

Sep 01 2020

Saya menggunakan spring boot 2.2.6 dan Jackson 2.10.3 dengan Java 8. Saya menggunakan objek localdatetime sepanjang proyek saya. Jackson tidak dapat mengurai LocalDateTime dengan benar (atau mungkin format defaultnya) dan tanggal pengiriman dalam respons json seperti dalam format array seperti di bawah ini

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

Seperti yang dijelaskan dalam format JSON Java 8 LocalDateTime di Spring Boot , Spring boot 2 sudah memiliki jackson-datatype-jsr310: 2.10.3 default di classpath. Saya ingin tanggal diwakili di json sebagai 2020-03-31: 00 di seluruh proyek. Solusi pertama tidak berfungsi di tautan di atas. Setelah itu saya mencoba penjelasan @JsonSerialize dan berhasil tetapi saya tidak ingin menerapkannya di setiap kelas. Begitu juga mencoba untuk menimpa pemeta objek tetapi tidak berhasil

@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;
    }

Juga mencoba menyesuaikan Jackson2ObjectMapperBuilder, tetapi masih memiliki tanggal dalam format array

@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;
    }

Mencoba juga 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;
    }

}

apakah ada yang bisa saya lakukan di tingkat global, jadi setiap tanggal dalam proyek akan diserialkan dalam format string seperti 2020-09-01?

Saran apa pun akan membantu.

Jawaban

3 PrabjotSingh Sep 02 2020 at 04:09

Pelakunya adalah @EnableWebMVC. Salah satu kelas cors saya mengadakan @EnableWebMVCanotasi. Ini menonaktifkan konfigurasi otomatis boot musim semi dan juga menimpa konfigurasi mapper. Ini tidak akan membiarkan Anda mengganti konfigurasi pemeta objek. Dengan menghapus @EnableMVCanotasi, ini berfungsi dengan baik sekarang. Di SpringBoot2 , kami tidak perlu melakukan konfigurasi apa pun yang secara eksplisit terkait dengan serialisasi tanggal, ini akan secara otomatis mengurai tanggal java 8 dalam format "yyyy-mm-dd" .

1 AbhijitSarkar Sep 01 2020 at 06:50

Buat kacang Jackson2ObjectMapperBuilderCustomizer :

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    return builder -> {
        builder.simpleDateFormat(dateTimeFormat);
        builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
        builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
    };
}

Tambahkan properti spring.jackson.serialization.write_dates_as_timestamps=falseke application.propertiesatau Anda juga dapat melakukannya secara terprogram di Jackson2ObjectMapperBuilderCustomizer.