You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:20:20