Spring Rest api 过滤响应中的字段

问题描述 投票:0回答:3

我正在使用 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. 

在这种情况下,我只需要返回请求参数“fields”中的字段。 JSON 输出应仅包含名字、姓氏。

有多种方法可以根据对象过滤 Jackson 中的字段。就我而言,我需要通过将字段列表传递给 Jackson 序列化器来动态过滤。

请分享一些想法。

json spring rest filter
3个回答
18
投票

谢谢阿里。这是一个很大的帮助。今天就让我来实现吧。我会发布结果

@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;
}

3
投票

使用

ResponseBodyAdvice
以便在将响应写入 HTTP 响应之前更改响应。在
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;
    }
}

0
投票

看来 Spring 4.2 中支持此功能,通过 Jackson JsonFilter

https://github.com/spring-projects/spring-framework/issues/17187
(尽管 jira 目前返回错误)。

© www.soinside.com 2019 - 2024. All rights reserved.