代码之家  ›  专栏  ›  技术社区  ›  p.streef

如何序列化java.time。Spring Webflux中的即时ISO字符串

  •  0
  • p.streef  · 技术社区  · 4 年前

    我如何配置webflux将java.time(特别是Instant)序列化为ISO日期字符串?

    使用以下代码,我得到:

    {"id":"id","timestamp":1606890022.131813600}

    我想买

    {"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;
            }
        }
    }
    

    我尝试过以下配置:

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

    但它不会改变响应。我认为格式化程序仅用于WebClient的反序列化和编解码器(但可能会出错)。

    0 回复  |  直到 4 年前
        1
  •  9
  •   M. Deinum    4 年前

    由于添加了以下内容,您正在禁用Jackson和WebFlux的自动配置 @EnableWebFlux 。使用此Spring Boot将在配置方面有所退步,其中之一是完全预配置的Jackson。

    因此,在这种情况下,尽量不要智胜默认值。

    删除 @启用WebFlux 并删除Jackson的特定格式。你实际上可以删除 implements WebFluxConfigurer 并删除被覆盖的方法。

        2
  •  3
  •   Roger Frauca Cordoba    3 年前

    我确实和斯特雷夫有同样的问题。

    在我的例子中,实现WebFluxConfigurer并使用configureHttpMessageCodecs可以解决问题。

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