ros*_*hal 3 java rest spring jax-rs spring-mvc
我希望能够在特定端点方法返回其值后处理对 Spring RestController 的 HTTP 请求的结果。例如我有:
GET /customer/{id}
Run Code Online (Sandbox Code Playgroud)
这通常只返回自定义资源。我定义的端点RestController只是返回一个客户对象。
我希望能够修改HttpEntity根据此返回结果生成的响应。特别是,我想在这个后处理器中完成所有 HATEOAS 工作并将其包装在我的父对象中。
实现这一目标的最佳方法是什么?我会包括我已经尝试过的内容,但我想不出任何可以干净地完成此操作的方法。
在实现 JAX-RS 的框架中,您所需要做的就是实现接口ContainerResponseFilter,然后可以将其添加到 REST 服务器。使用 Jersey 或 CXF 很容易做到这一点。
ContainerResponseFilterSpring REST中有一个概念吗?
我认为,您需要的是ResponseBodyAdvice。
根据文档,
允许在执行 @ResponseBody 或 ResponseEntity 控制器方法之后但在使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于它带有注释@ControllerAdvice,因此您的控制器将自动检测到它。
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |