LocalDateTime représente au format tableau
J'utilise Spring Boot 2.2.6 et Jackson 2.10.3 avec Java 8. J'utilise des objets localdatetime dans mon projet. Jackson n'est pas capable d'analyser correctement LocalDateTime (ou peut-être son format par défaut) et d'envoyer la date dans la réponse json comme dans le format de tableau comme ci-dessous
"createdDate": [
2020,
8,
31,
0,
0,
0,
80000000
]
Comme décrit dans le format JSON Java 8 LocalDateTime dans Spring Boot , Spring Boot 2 a déjà jackson-datatype-jsr310: 2.10.3 par défaut sur le chemin de classe. Je veux que les dates soient représentées dans json comme 2020-03-31: 00 dans l'ensemble du projet. La première solution ne fonctionne pas dans le lien ci-dessus. Après cela, j'ai essayé l'annotation @JsonSerialize et cela fonctionne mais je ne veux pas appliquer sur chaque classe. J'ai donc essayé de remplacer le mappeur d'objet mais cela n'a pas fonctionné
@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;
}
Également essayé de personnaliser Jackson2ObjectMapperBuilder, mais toujours avoir la date au format tableau
@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;
}
Essayé avec aussi 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")));
};
}
}
Contrôleur
@RestConroller
@RequestMapping("/user")
UserController {
User getUser(){
User user = new User()
user.createdDate = LocalDateTime.now();
return user;
}
}
y a-t-il quelque chose que je puisse faire au niveau mondial, de sorte que chaque date du projet sera sérialisée au format chaîne comme 2020-09-01?
Toute suggestion sera utile.
Réponses
Le coupable était @EnableWebMVC. Un de mes cours de cors avait une @EnableWebMVCannotation. Cela désactivait la configuration automatique du démarrage à ressort et remplaçait également la configuration du mappeur. Cela ne vous permettra pas de remplacer la configuration du mappeur d'objets. En supprimant l' @EnableMVCannotation, cela fonctionne correctement maintenant. Dans SpringBoot2 , nous n'avons pas besoin de faire de configuration explicitement liée à la sérialisation des dates, il analysera automatiquement les dates java 8 au format "aaaa-mm-jj" .
Créez 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)));
};
}
Ajoutez une propriété spring.jackson.serialization.write_dates_as_timestamps=falseà application.propertiesou vous pouvez également le faire par programme dans le Jackson2ObjectMapperBuilderCustomizer.