LocalDateTime wird im Array-Format dargestellt

Sep 01 2020

Ich verwende Spring Boot 2.2.6 und Jackson 2.10.3 mit Java 8. Ich verwende Localdatetime-Objekte in meinem gesamten Projekt. Jackson ist nicht in der Lage, LocalDateTime richtig zu analysieren (oder möglicherweise das Standardformat) und das Versanddatum in der JSON-Antwort wie im Array-Format wie unten

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

Wie im JSON Java 8 LocalDateTime-Format in Spring Boot beschrieben , hat Spring Boot 2 bereits den Standard-Jackson-Datentyp-jsr310: 2.10.3 im Klassenpfad. Ich möchte, dass die Daten in json als 2020-03-31: 00 im gesamten Projekt dargestellt werden. Die erste Lösung funktioniert im obigen Link nicht. Danach habe ich versucht, @JsonSerialize Annotation und es funktioniert, aber ich möchte nicht auf jede einzelne Klasse anwenden. Also habe ich auch versucht, Object Mapper zu überschreiben, aber es hat nicht funktioniert

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

Ich habe auch versucht, Jackson2ObjectMapperBuilder anzupassen, habe aber immer noch ein Datum im Array-Format

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

Versucht auch mit 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")));
        };
    }
}

Steuerung

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

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

}

Kann ich auf globaler Ebene etwas tun, damit jedes Datum im Projekt wie im String-Format wie 2020-09-01 serialisiert wird?

Jeder Vorschlag wird hilfreich sein.

Antworten

3 PrabjotSingh Sep 02 2020 at 04:09

Der Schuldige war @EnableWebMVC. Eine meiner Cors-Klassen hatte @EnableWebMVCAnmerkungen. Dies deaktivierte die automatische Konfiguration des Federboots und überschrieb auch die Mapper-Konfiguration. Auf diese Weise können Sie die Konfiguration des Objekt-Mappers nicht überschreiben. Durch das Entfernen von @EnableMVCAnmerkungen funktioniert dies jetzt einwandfrei. In SpringBoot2 müssen wir keine Konfiguration vornehmen , die explizit mit der Datumsserialisierung zusammenhängt. Die Java 8-Daten werden automatisch im Format "JJJJ-MM-TT" analysiert .

1 AbhijitSarkar Sep 01 2020 at 06:50

Erstellen Sie eine 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)));
    };
}

Eigenschaft hinzufügen spring.jackson.serialization.write_dates_as_timestamps=falsezu application.propertiesoder Sie können es auch in der programmatisch tun Jackson2ObjectMapperBuilderCustomizer.