Spring REST post处理所有HTTP请求

时间:2017-07-24 03:19:40

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

我正在努力实现的目标

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

GET / customer / {id}

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

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

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

在实现JAX-RS的框架中,您需要做的就是实现ContainerResponseFilter接口,然后将其添加到REST服务器。这对泽西岛或CXF来说很简单。

Spring REST中是否有ContainerResponseFilter的概念?

2 个答案:

答案 0 :(得分:2)

我想,你需要的是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进行注释,因此会自动检测到您的控制器。

答案 1 :(得分:0)

你可以编写一个Spring MVC Interceptor并将它放在你想要的Controller方法上,你可以使用postHandle方法来做你想做的事。

看看这个post