LocalDateTime rappresenta in formato array

Sep 01 2020

Sto usando lo spring boot 2.2.6 e Jackson 2.10.3 con Java 8. Sto usando oggetti localdatetime durante il mio progetto. Jackson non è in grado di analizzare correttamente LocalDateTime (o potrebbe essere il formato predefinito) e inviare la data nella risposta json come nel formato array come di seguito

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

Come descritto nel formato JSON Java 8 LocalDateTime in Spring Boot , Spring Boot 2 ha già il jackson-datatype-jsr310: 2.10.3 predefinito su classpath. Voglio che le date rappresentino in json come 2020-03-31: 00 in tutto il progetto. La prima soluzione non funziona nel collegamento sopra. Dopo di che ho provato l'annotazione @JsonSerialize e funziona ma non voglio applicare su ogni classe. Quindi ho anche provato a sovrascrivere il mappatore di oggetti ma non ha funzionato

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

Ho anche provato a personalizzare Jackson2ObjectMapperBuilder, ma hanno ancora la data in formato 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;
    }

Ho provato anche con 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;
    }

}

c'è qualcosa che posso fare a livello globale, quindi ogni data nel progetto verrà serializzata come in formato stringa come 2020-09-01?

Qualsiasi suggerimento sarà utile.

Risposte

3 PrabjotSingh Sep 02 2020 at 04:09

Il colpevole era @EnableWebMVC. Una delle mie lezioni di cors stava avendo @EnableWebMVCannotazioni. Ciò disabilitava la configurazione automatica dell'avvio a molla e sovrascriveva anche la configurazione del mapper. Questo non ti permetterà di sovrascrivere la configurazione di object mapper. Rimuovendo l' @EnableMVCannotazione, ora funziona correttamente. In SpringBoot2 , non è necessario eseguire alcuna configurazione esplicitamente correlata alla serializzazione della data, analizzerà automaticamente le date di Java 8 nel formato "aaaa-mm-gg" .

1 AbhijitSarkar Sep 01 2020 at 06:50

Crea un bean Jackson2ObjectMapperBuilderCustomizer :

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

Aggiungi proprietà spring.jackson.serialization.write_dates_as_timestamps=falsea application.propertiesoppure puoi farlo anche a livello di codice in Jackson2ObjectMapperBuilderCustomizer.