我正在使用带有@RestController的Spring MVC 4.3.2,我希望能够在请求中动态过滤客户指定的JSON属性。
为了简单起见,我们假设我有一个包含firstName和lastName字段的Person POJO。生成此POJO,这就是为什么您会看到我使用mixin的原因。
让我们说一个客户想要检索所有人。 firstName,他会像我这样调用我们的休息端点:http://localhost/persons&fields=firstName。并且json将只包含firstName,而不是lastName字段。
这是我的控制器:
@RestController
public class RestPersonController implements PersonApi {
@Autowired
private PersonService personService;
@Autowired
private ObjectMapper objectMapper;
@Override
@GetMapping(path = "/persons")
public ResponseEntity<List<Person>> getPersons(
@RequestParam(required = false) String fields) {
List<Person> persons = this.personService.getPersons();
// Filter fields
if (StringUtils.isNotBlank(fields)) {
configureFilter(fields);
}
return ResponseEntity.status(HttpStatus.OK).body(persons);
}
private void configureFilter(String fields) {
Set<String> fieldsToKeep = new HashSet<>();
fieldsToKeep.add(fields);
objectMapper.addMixIn(Person.class, PersonDynamicFilterMixIn.class);
FilterProvider filterProvider = new SimpleFilterProvider().
addFilter("dynamicFilter", SimpleBeanPropertyFilter.filterOutAllExcept(fieldsToKeep));
objectMapper.setFilterProvider(filterProvider);
}
}
正如您所看到的,该方法的返回值为ResponseEntity<List<Person>>
(我无法将其更改为JacksonMappingValue
,它来自PersonApi接口)并且我们将返回{{1 (所以我不能自己用objectMapper手动编写JSON响应);。
引擎盖下,Spring正在使用Jackson ObjectMapper进行转换。我想在指定字段请求参数时配置ObjectMapper。
我还希望ObjectMapper配置与Spring的默认配置相同。
我无法使用JsonViews,因为它不再是动态的。
有人能告诉我如何配置Spring来做到这一点吗?我尝试在SpringConfiguration中使用这些东西,但最后我的一些测试不再适用了。对于某些测试,如果我运行单个测试,它会通过,如果我运行整个测试套件,测试不再通过......
ResponseEntity.status(HttpStatus.OK).body(persons)
感谢您的帮助!