¿Cómo puedo configurar webflux para serializar java.time (específicamente Instant) como una cadena de fecha ISO?
Con el siguiente código obtengo:
{"id":"id","timestamp":1606890022.131813600}
Me gustaría conseguir
{"id":"id","timestamp":"2020-12-02T07:20:16.553Z"}
@EnableWebFlux @SpringBootApplication public class WebfluxJavaTimeSerializationApplication { public static void main(String[] args) { SpringApplication.run(WebfluxJavaTimeSerializationApplication.class, args); } @Bean public RouterFunction<?> routerFunction() { return route().GET("/resource", request -> ServerResponse.ok().body(Mono.just(new Resource()),Resource.class)).build(); } public class Resource { String id = "id"; Instant timestamp = Instant.now(); public String getId() { return id; } public Instant getTimestamp() { return timestamp; } } }He probado configuraciones como:
@Configuration @EnableWebFlux public class WebConfig implements WebFluxConfigurer { //moved from application class @Bean public RouterFunction<?> routerFunction() { return route().GET("/resource", request -> ServerResponse.ok().body(Mono.just(new Resource()), Resource.class)).build(); } @Override public void addFormatters(FormatterRegistry registry) { DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); registrar.setUseIsoFormat(true); registrar.registerFormatters(registry); } @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); } }pero no cambia la respuesta. Creo que los formateadores solo se usan para la deserialización y los códecs para WebClient (pero pueden estar equivocados).
Está deshabilitando la configuración automática de Jackson y WebFlux debido a que agregó @EnableWebFlux . Con este Spring Boot, retrocederá en la configuración de las cosas, una de esas cosas es un Jackson completamente preconfigurado.
Así que trate de no engañar a los valores predeterminados en este caso.
Elimine @EnableWebFlux y también elimine el formato específico para Jackson. En realidad, podría eliminar los implements WebFluxConfigurer y eliminar los métodos anulados.
Tengo el mismo problema que Streef.
En mi caso, implementar WebFluxConfigurer y usar configureHttpMessageCodecs es lo que resuelve el problema.
@Configuration public class JacksonConfiguration implements WebFluxConfigurer { private final ObjectMapper mapper; public JacksonConfiguration(ObjectMapper mapper) { this.mapper = mapper; } @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder(mapper)); configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(mapper)); WebFluxConfigurer.super.configureHttpMessageCodecs(configurer); } }