簡體   English   中英

Spring REST post 處理所有 HTTP 請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM