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
相关产品推荐
相关产品推荐

