配置的ObjectMapper未在spring-boot-webflux中使用

use*_*967 9 spring-boot spring-webflux

我在我的objectmapperbuilder配置中配置了mixins,使用常规弹簧Web控制器,根据mixins输出数据.但是,使用webflux,具有返回Flow或Mono的方法的控制器将数据序列化,就像objectmapper是默认数据一样.

如何让webflux强制执行objectmapper配置?

示例配置:

@Bean
JavaTimeModule javatimeModule(){
    return new JavaTimeModule();
}

@Bean
Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
return jacksonObjectMapperBuilder ->  jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                                                                    .mixIn(MyClass.class, MyClassMixin.class);
}
Run Code Online (Sandbox Code Playgroud)

geo*_*rce 11

为了方便,我将@Alberto Galiana 的解决方案翻译成Java,并注入了配置好的Objectmapper,这样就可以避免进行多次配置:

@Configuration
@RequiredArgsConstructor
public class WebFluxConfig implements WebFluxConfigurer {

    private final ObjectMapper objectMapper;

    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().jackson2JsonEncoder(
            new Jackson2JsonEncoder(objectMapper)
        );

        configurer.defaultCodecs().jackson2JsonDecoder(
            new Jackson2JsonDecoder(objectMapper)
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 此示例使用构造函数注入,因此不需要 Autowired 注释。构造函数由 RequiredArgsConstructor Lombok 注释生成。但是,如果您删除最后一个 Keyword,您可以删除该注释并在字段上添加 Autowired 注释 (4认同)

use*_*967 8

我实际上通过逐步执行init代码找到了我的解决方案:

@Configuration
public class Config {

    @Bean
    JavaTimeModule javatimeModule(){
        return new JavaTimeModule();
    }

    @Bean
    Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.featuresToEnable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .mixIn(MyClass.class, MyClassMixin.class);
    }


    @Bean
    Jackson2JsonEncoder jackson2JsonEncoder(ObjectMapper mapper){
       return new Jackson2JsonEncoder(mapper);
    }

    @Bean
    Jackson2JsonDecoder jackson2JsonDecoder(ObjectMapper mapper){
        return new Jackson2JsonDecoder(mapper);
    }

    @Bean
    WebFluxConfigurer webFluxConfigurer(Jackson2JsonEncoder encoder, Jackson2JsonDecoder decoder){
        return new WebFluxConfigurer() {
            @Override
            public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
                configurer.defaultCodecs().jackson2Encoder(encoder);
                configurer.defaultCodecs().jackson2Decoder(decoder);
            }
        };

    }
}
Run Code Online (Sandbox Code Playgroud)

  • `@ EnableWebFlux`将停用所有webflux自动配置,所以我不会在这里使用它. (4认同)

小智 8

只需实现WebFluxConfigurer并覆盖方法configureHttpMessageCodecs

Spring Boot 2 + Kotlin 的示例代码

@Configuration
@EnableWebFlux
class WebConfiguration : WebFluxConfigurer {

    override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
        configurer.defaultCodecs().jackson2JsonEncoder(Jackson2JsonEncoder(ObjectMapper()
                .setSerializationInclusion(JsonInclude.Include.NON_EMPTY)))

        configurer.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(ObjectMapper()
                .enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)))
    }
}
Run Code Online (Sandbox Code Playgroud)

确保所有要编码/解码的数据类都使用@JsonProperty注释其所有属性,即使类和 json 数据中的属性名称相同

data class MyClass(
    @NotNull
    @JsonProperty("id")
    val id: String,

    @NotNull
    @JsonProperty("my_name")
    val name: String)
Run Code Online (Sandbox Code Playgroud)