LocalDateTime wird im Array-Format dargestellt
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
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 .
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.