LocalDateTime rappresenta in formato array
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
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" .
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.