Spring MVC Spring REST后处理所有HTTP请求

huus2vyu  于 2022-11-15  发布在  Spring
关注(0)|答案(2)|浏览(162)

我想完成的事#

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

GET /customer/{id}

这通常只返回一个自定义资源,我在RestController中定义的端点只返回一个customer对象。
我希望能够修改这个返回结果的HttpEntity响应。特别是,我希望在这个后处理器中完成所有的HATEOAS工作,并将其 Package 在我的父对象中。
什么是最好的方法来完成这一点?我会包括我已经尝试过的,但我想不出任何方法可以做到这一点干净。
在实现JAX-RS的框架中,您需要做的就是实现ContainerResponseFilter接口,然后将其添加到REST服务器中。
Spring REST中是否存在ContainerResponseFilter的概念?

rggaifut

rggaifut1#

我想,你需要的是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注解的,所以会自动为您的控制器检测到它。

vlju58qv

vlju58qv2#

您可以编写一个SpringMVC拦截器,并将其置于所需的Controller方法之上,您可以使用postHandle方法来执行您想要执行的操作。
看看这个post

相关问题