我正在努力实现的目标
我希望能够在特定端点方法返回其值后,将HTTP请求的结果处理到Spring RestController。例如。我有:
GET / customer / {id}
这通常只返回自定义资源。我在RestController中定义的端点只返回一个客户对象。
我希望能够修改从此返回结果中制作的HttpEntity响应。特别是,我想在这个后处理器中完成所有HATEOAS工作并将其包装在我的父对象中。
实现这一目标的最佳方法是什么?我会包括我尝试过的内容,但我想不出任何可以干净利落的方式。
在实现JAX-RS的框架中,您需要做的就是实现ContainerResponseFilter接口,然后将其添加到REST服务器。这对泽西岛或CXF来说很简单。
Spring REST中是否有ContainerResponseFilter的概念?
答案 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