Spring响应api筛选器字段
我使用spring rest api 4.x. 我们有要求根据请求参数过滤响应中的字段。
我的用户对象:
private class UserResource {
private String userLastName;
private String userFirstName;
private String email;
private String streetAddress;
}
E.g. URL: curl -i http://hostname:port/api/v1/users?fields=firstName,lastName.
在这种情况下,我只需要返回请求参数“字段”中的字段。 JSON输出应该只包含firstName,lastName。
有几种方法可以根据对象过滤Jackson中的字段。 在我的情况下,我需要通过将字段列表传递给Jackson序列化器来动态过滤。
请分享一些想法。
谢谢阿里。 这是一个很大的帮助。 让我今天执行它。 我会公布结果
@JsonFilter("blah.my.UserEntity")
public class UserEntity implements Serializable {
//fields goes here
}
@RequestMapping(value = "/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public MappingJacksonValue getUsers(@RequestParam MultiValueMap<String, String> params) {
//Build pageable here
Page<UserEntity> users = userService.findAll(pageable);
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(users);
FilterProvider filters = new SimpleFilterProvider()
.addFilter("blah.my.UserEntity", SimpleBeanPropertyFilter
.filterOutAllExcept("userFirstName"));
mappingJacksonValue.setFilters(filters);
return mappingJacksonValue;
}
在写入HTTP响应之前,使用ResponseBodyAdvice
来更改响应。 在beforeBodyWrite(...)
方法中,您可以访问当前的ServerHttpRequest
,您可以读取fields
值。 你的身体建议如下所示:
@ControllerAdvice
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<UserResource> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return returnType.getParameterType().equals(UserResource.class);
}
@Override
public UserResource beforeBodyWrite(UserResource body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
String fields = ((ServletServerHttpRequest) request).getServletRequest().getParameter("fields");
// body.set...(null) for each field not in fields
return body;
}
}
按照https://jira.spring.io/browse/SPR-12586通过Jackson JsonFilter
(虽然jira目前返回一个错误),Spring 4.2支持它。
上一篇: Spring rest api filter fields in the response
下一篇: How to deserialize JSON to model object with Spring's RestController