WebFlux配置@JsonFilter后抛出InvalidDefinitionException异常排查
WebFlux中@JsonFilter配置不生效的原因及解决方案
问题原因
你通过构造函数注入ObjectMapper并设置FilterProvider的方式不生效,核心原因是:WebFlux的HTTP响应编码使用独立的Jackson2JsonEncoder实例,它内部的ObjectMapper并未被你修改的实例覆盖。Spring WebFlux默认会为HTTP编解码器创建专属的ObjectMapper,而非直接使用全局注入的实例,所以你的过滤器配置无法作用到接口响应的序列化流程中。
解决方案
需要通过配置WebFlux的HTTP编解码器,让其使用带有自定义FilterProvider的ObjectMapper。推荐两种实现方式:
方式一:实现WebFluxConfigurer接口
@Configuration public class JacksonConfiguration implements WebFluxConfigurer { @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { // 初始化带有过滤器配置的ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); SimpleFilterProvider filterProvider = new SimpleFilterProvider() .setFailOnUnknownId(false) .addFilter("partnerScoreFilter", SimpleBeanPropertyFilter.serializeAllExcept("score")); objectMapper.setFilterProvider(filterProvider); // 替换默认的Jackson编解码器 ServerCodecConfigurer.DefaultCodecs defaultCodecs = configurer.defaultCodecs(); defaultCodecs.jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)); defaultCodecs.jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper)); } }
方式二:直接注册Jackson编解码器Bean
@Configuration public class JacksonConfiguration { @Bean public ObjectMapper webFluxObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleFilterProvider filterProvider = new SimpleFilterProvider() .setFailOnUnknownId(false) .addFilter("partnerScoreFilter", SimpleBeanPropertyFilter.serializeAllExcept("score")); objectMapper.setFilterProvider(filterProvider); return objectMapper; } @Bean public Jackson2JsonEncoder jackson2JsonEncoder(ObjectMapper webFluxObjectMapper) { return new Jackson2JsonEncoder(webFluxObjectMapper); } @Bean public Jackson2JsonDecoder jackson2JsonDecoder(ObjectMapper webFluxObjectMapper) { return new Jackson2JsonDecoder(webFluxObjectMapper); } }
说明
两种方式的核心逻辑一致:创建配置好过滤器的ObjectMapper,并让WebFlux的HTTP编解码器使用该实例,确保接口响应序列化时能触发你定义的partnerScoreFilter。
内容的提问来源于stack exchange,提问作者Sanchelz
相关产品推荐
相关产品推荐

