gpt4 book ai didi

java - Spring REST 后处理所有 HTTP 请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:47 24 4
gpt4 key购买 nike

我想要完成的事情

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

GET /customer/{id}

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

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

实现此目标的最佳方法是什么?我会包括我尝试过的方法,但我想不出有什么方法可以干净利落地完成。

在实现 JAX-RS 的框架中,您需要做的就是实现 ContainerResponseFilter 接口(interface),您可以将它添加到您的 REST 服务器。使用 Jersey 或 CXF 很容易做到这一点。

Spring REST 中有ContainerResponseFilter 的概念吗?

最佳答案

我想,你需要的是ResponseBodyAdvice .

根据文档,

Allows customizing the response after the execution of an @ResponseBody or a ResponseEntity controller method but before the body is written with an HttpMessageConverter.

Implementations may be may be registered directly with RequestMappingHandlerAdapter and ExceptionHandlerExceptionResolver or more likely annotated with @ControllerAdvice in which case they will be auto-detected by both.

您对 OutputStream 的其他关注将得到解决,并且 body 将直接可用,

@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,它会被自动检测到你的 Controller 。

关于java - Spring REST 后处理所有 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45272102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com