[英]Spring REST post process all HTTP requests
在特定端點方法返回它的值之后,我希望能夠處理對 Spring RestController 的 HTTP 請求的結果。 例如我有:
GET /customer/{id}
這通常只返回一個自定義資源。 我在RestController
中定義的端點只是返回一個客戶對象。
我希望能夠修改根據此返回結果制作的HttpEntity
響應。 特別是,我想在這個后處理器中完成所有 HATEOAS 工作,並將其包裝在我的父對象中。
實現這一目標的最佳方法是什么? 我會包括我嘗試過的東西,但我想不出任何可以干凈地完成的方法。
在實現 JAX-RS 的框架中,您需要做的就是實現ContainerResponseFilter
接口,然后您可以將它添加到您的 REST 服務器。 使用 Jersey OR CXF 很容易做到這一點。
Spring REST 中有ContainerResponseFilter
的概念嗎?
我認為,您需要的是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;
}
}
由於它帶有@ControllerAdvice
注釋,因此會自動檢測到您的控制器。
您可以編寫一個 Spring MVC 攔截器並將其放在您想要的 Controller 方法上,然后您可以使用postHandle
方法來做您想做的事情。
看看這個帖子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.