Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将HTTPServletResponse转换为HttpEntity?_Java_Spring_Rest_Spring Mvc_Servlets - Fatal编程技术网

Java 如何将HTTPServletResponse转换为HttpEntity?

Java 如何将HTTPServletResponse转换为HttpEntity?,java,spring,rest,spring-mvc,servlets,Java,Spring,Rest,Spring Mvc,Servlets,在我的项目中,我有多个API(使用SpringRESTAPI实现)。 现在我有这样一个要求,在将响应发送到客户机之前,我必须以特定的方式操纵响应,在每个API方法中更改响应似乎不是一个好的选择 我能想到的唯一解决方案是使用servlet.Filter(通过扩展Filter类) 然后写下我的逻辑 链式过滤器(要求、恢复) 但我正在努力将ServletResponse或HTTPServletResponse转换为HttpEntity 请帮助我如何才能做到这一点?有没有更好的办法 谢谢 更新 @jny

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

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

然后写下我的逻辑

链式过滤器(要求、恢复)

但我正在努力将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;
    }
@ControllerAdvice(basePackages={“com.test.controller”})//它将在其中查找控制器的包。
公共类ResponseFilter实现ResponseByAdvice{
@凌驾
BodyWrite之前的公共对象(对象主体、方法参数returnType、MediaType selectedContentType、,
Class>selectedConverterType,ServerHttpRequest请求,
服务器HttpResponse(响应){
//在这里,你可以按你想要的方式操纵身体。
返回体;
}

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

注释,这取决于您需要什么。 如果您需要更改响应的主体, 如果使用
Spring 4.1
或更高版本,则可以使用操纵响应主体

如果需要筛选某些字段,还有其他可用选项。 从文件:

实现可以直接注册到 RequestMappingHandlerAdapter和ExceptionHandlerExceptionResolver或 更可能用@ControllerAdvice注释,在这种情况下,它们将 两者都会自动检测到


这可能会为您指明正确的方向:


它涉及在调用doFilter之前包装ServletResponse,并使用自定义ServletOutputStream,允许在响应数据正常关闭后对其进行操作。不涉及HttpEntity。

正如我从文档中了解到的,需要从方法调用ResponseBodyAdvice(在返回响应之前)事实上,这是一个很大的工作。我想在过滤器中以某种方式处理这个逻辑。我的动机是阅读响应boda操纵它并将其写回响应。更新的答案表明,你不需要从方法调用它,这正是我所要找的。谢谢。你能补充一些细节吗?响应看起来如何就像你建议的过滤器之前?你希望它看起来像什么?
@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;
    }