当前位置: 首页 > 知识库问答 >
问题:

响应中的Spring rest api过滤器字段

潘高岑
2023-03-14

我使用的是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输出应该只包含名字和姓氏。

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

请分享一些想法。

共有3个答案

汪丁雷
2023-03-14

根据https://jira.spring.io/browse/SPR-12586通过JacksonJsonFilter(尽管jira目前正在返回错误)。

胡越
2023-03-14

使用响应正文通知是为了在响应写入 HTTP 响应之前更改响应。在之前正文(...) 方法中,您可以访问当前服务器Http请求,您可以读取字段值。你的身体建议看起来像这样:

@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;
    }
}
公冶翰池
2023-03-14

谢谢阿里。这是一个很大的帮助。让我今天实施它。我会发布结果

@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;
}
 类似资料:
  • 我有下面的servlet过滤器。

  • 我需要在每个响应中添加标题。我正打算在下面做 我想在之后这样做,以便一旦控制器处理它,我只是在返回客户端之前添加标头。是正确的吗? 但如何编写响应过滤器? 在已返回,对响应执行任何操作都为时已晚。此时,整个响应已经发送到客户端,您的代码无法访问它。 我觉得上面的说法不对。我不能在过滤链之后添加标题。doFilter(请求、响应)?如果不是,为什么? 我使用的是spring mvc。

  • 问题内容: 有没有办法只处理过滤器中的响应。 下面编写的代码是否正确? 问题答案: 这取决于您想要什么。通常,您的样本虽然不正确。之后chain.doFilter又回来了,这是来不及做的任何回应。此时,整个响应已发送到客户端,您的代码无法访问它。 您需要做的是包装request和/或包装response到您自己的类中,将这些包装传递给doFilter方法,并处理包装中的所有处理。 为了使其更容易,

  • 我正在使用spring云网关作为边缘服务器。这就是流程 问题是,响应有响应是得到正确的200代码,注入的头是在响应上出现,但数据是不可用的响应。

  • 在Jersey中,可以添加或 两者都是使用PackagesResourceConfig添加的: 谢谢

  • 我想给来自我的服务器的http响应添加一些头。我需要添加标题,无论代码(2xx,4xx,5xx)返回应用程序。我尝试用< code>@WebFilter批注实现< code > javax . servlet . filter ,用< code>@Provider批注实现< code > javax . ws . RS . container . container response filter