【问题标题】:Spring REST post process all HTTP requestsSpring REST post 处理所有 HTTP 请求
【发布时间】:2017-12-29 12:55:28
【问题描述】:

我正在努力实现的目标

我希望能够在特定端点方法返回其值后处理对 Spring RestController 的 HTTP 请求的结果。例如。我有:

GET /customer/{id}

这通常只返回一个自定义资源。我在 RestController 中定义的端点只是返回一个客户对象。

我希望能够修改根据此返回结果制作的 HttpEntity 响应。特别是,我想在这个后处理器中完成所有 HATEOAS 工作并将其包装在我的父对象中。

实现这一目标的最佳方法是什么?我会包括我尝试过的内容,但我想不出任何可以干净利落地完成的方式。

在实现 JAX-RS 的框架中,您需要做的就是实现 ContainerResponseFilter 接口,然后您可以将它添加到您的 REST 服务器。使用 Jersey OR CXF 很容易做到这一点。

Spring REST 中有 ContainerResponseFilter 的概念吗?

【问题讨论】:

  • 您可以为特定的 REST Controller 方法添加 After 建议并执行您的特定处理。
  • 以前从未使用过 AOP。有我的例子吗?
  • 另外,这可能行不通。我想将我的 Customer 对象包装在另一个对象中,并将其作为 HttpEntity 的一部分返回

标签: java spring rest spring-mvc jax-rs


【解决方案1】:

我想,你需要的是ResponseBodyAdvice

根据文档,

允许在执行一个响应后自定义响应 @ResponseBody 或 ResponseEntity 控制器方法,但在 body 是用 HttpMessageConverter 编写的。

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

您对OutputStream 的其他担忧将得到解决,正文将直接可用,

@ControllerAdvice
public class CustomerResponseFilter implements ResponseBodyAdvice<ResponseEntity<Customer>> {

    @Override
    public boolean supports(MethodParameter returnType,
        Class<? extends HttpMessageConverter<?>> converterType) {
    // TODO Auto-generated method stub
    return false;
    }

    @Override
    public ResponseEntity<Customer> beforeBodyWrite(ResponseEntity<Customer> body,
        MethodParameter returnType, MediaType selectedContentType,
        Class<? extends HttpMessageConverter<?>> selectedConverterType,
        ServerHttpRequest request, ServerHttpResponse response) {

    //..do your manipulations 
    return body;
    }

}

由于它带有 @ControllerAdvice 注释,因此将自动为您的控制器检测到它。

【讨论】:

  • 美丽。这可能是黄金答案
  • 唯一缺少的是它只允许你修改对象本身,你不能像我想要的那样包装它。无论如何,它适合我的需要,因为我正在使用我想要的解决方法。谢谢!
【解决方案2】:

您可以编写一个 Spring MVC 拦截器并将其放在您想要的 Controller 方法上,然后您可以使用postHandle 方法来做您想做的事情。

看看这个post

【讨论】:

  • 嗯,虽然这让我可以访问请求/响应,但它是 OutputStream 的形式。我必须读回一个对象,如果我有时返回客户列表、单个客户对象、其他数据模型可能会很困难......
猜你喜欢
  • 2010-12-08
  • 2016-01-27
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多