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

Spring MVC 4.3 Rest接口如何实现请求指定的JSON字段动态过滤?

Spring MVC 4.3.2 结合@RestController实现JSON字段动态过滤

我刚好做过类似的需求,结合你用的Spring MVC 4.3.2和Jackson的序列化特性,完全可以实现按请求参数fields动态过滤返回的JSON字段,下面给你一步步拆解实现方式:

1. 准备Person Mixin类

因为你用了自动生成的Person POJO,用Mixin来定义过滤规则是最优解,不需要修改原始POJO代码。我们给Mixin指定一个过滤器名称,后续会用这个名称绑定动态规则:

// 定义Mixin类,标记需要被过滤的字段和对应的过滤器
public abstract class PersonMixin {
    @JsonFilter("personDynamicFilter")
    private String firstName;
    
    @JsonFilter("personDynamicFilter")
    private String lastName;
}

2. 注册Mixin到Jackson的ObjectMapper

接下来要让Jackson知道Person类和这个Mixin的绑定关系,我们可以通过Spring配置类来完成:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 把Mixin绑定到Person类上
        mapper.addMixIn(Person.class, PersonMixin.class);
        return mapper;
    }
}

如果你的项目里已经用了Spring自动配置的ObjectMapper,也可以直接注入后添加Mixin,效果是一样的。

3. 在Controller中实现动态过滤逻辑

核心是利用Spring提供的MappingJacksonValue类,它可以帮我们动态设置Jackson的过滤器规则,根据请求的fields参数来决定返回哪些字段:

@RestController
@RequestMapping("/persons")
public class PersonController {

    @GetMapping
    public MappingJacksonValue getPersons(@RequestParam(required = false) String fields) {
        // 这里模拟从数据库或其他服务获取人员列表
        List<Person> personsList = Arrays.asList(
                new Person("Alice", "Williams"),
                new Person("Bob", "Johnson")
        );

        // 用MappingJacksonValue包装要返回的对象
        MappingJacksonValue resultWrapper = new MappingJacksonValue(personsList);
        SimpleFilterProvider filterProvider = new SimpleFilterProvider();

        if (fields != null && !fields.trim().isEmpty()) {
            // 分割fields参数,支持多字段(比如fields=firstName,lastName)
            String[] includeFields = fields.split(",");
            // 创建只保留指定字段的过滤器
            filterProvider.addFilter("personDynamicFilter", 
                SimpleBeanPropertyFilter.filterOutAllExcept(includeFields));
        } else {
            // 如果没有传fields参数,返回所有字段
            filterProvider.addFilter("personDynamicFilter", 
                SimpleBeanPropertyFilter.serializeAll());
        }

        // 把过滤器绑定到返回结果上
        resultWrapper.setFilters(filterProvider);
        return resultWrapper;
    }
}

4. 测试验证

  • 当调用http://localhost/persons?fields=firstName时,返回的JSON只会包含firstName字段:
    [{"firstName":"Alice"},{"firstName":"Bob"}]
    
  • 如果不传递fields参数,会返回所有字段:
    [{"firstName":"Alice","lastName":"Williams"},{"firstName":"Bob","lastName":"Johnson"}]
    

小提醒

你之前写的请求URL里参数分隔符用错啦,应该是?而不是&,&是用来分隔多个参数的(比如http://localhost/persons?fields=firstName&age=18)。

内容的提问来源于stack exchange,提问作者Nis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:18