Spring MVC 4.3 Rest动态过滤字段

时间:2018-02-22 16:27:38

标签: rest spring-mvc jackson jackson2

我正在使用带有@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)

感谢您的帮助!

0 个答案:

没有答案