如何将HTTPServletResponse转换为HttpEntity?

时间:2016-02-09 14:21:12

标签: java spring rest spring-mvc servlets

在我的项目中,我有多个API(使用Spring REST API实现)。 现在我有这个要求,我必须在将响应发送到客户端之前以特定的方式操作响应,并且在每个API方法中更改它似乎不是一个好的选择。

我能想到的唯一解决方案是使用 servlet.Filter (通过扩展过滤器类)

 @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
> chain.doFilter(req, res);

并在

后写下我的逻辑
  

chain.doFilter(req,res);

但我正在努力将ServletResponse或HTTPServletResponse转换为HttpEntity。

请帮助我如何实现这一目标?还有更好的方法吗?

由于

更新

@jny解决方案帮助了我。

显示其工作原理的小代码段。

@ControllerAdvice(basePackages = { "com.test.controller" })   // package where it will look for the controllers.
public class ResponseFilter implements ResponseBodyAdvice<Object> {

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {
        //here you can manipulate the body the way you want.
        return body;
    }

重要的是你的控制器应该用 @ResponseBody

注释

2 个答案:

答案 0 :(得分:1)

这取决于你究竟需要什么。 如果您需要更改响应的正文, 如果您使用Spring 4.1或更高版本,则可以使用ResponseBodyAdvice来操纵响应的正文。

如果您需要过滤某些字段,还有其他可用选项。 来自文档:

  

实施可能可能直接注册   RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver或   更可能使用@ControllerAdvice进行注释,在这种情况下他们会   由两者自动检测。

答案 1 :(得分:0)

这可能会指向正确的方向:Spring MVC: How to modify json response sent from controller

它涉及在调用doFilter之前包装ServletResponse并使用自定义ServletOutputStream,该响应数据允许在通常关闭之后操作响应数据。 HttpEntity没有参与。