Spring MVC中的Json响应的后处理 [英] Post processing of a Json response in spring MVC
问题描述
我有几个控制器返回相同的通用Response对象与@ResponseBody注释,像这样:
I have several controllers that return the same generic Response object with @ResponseBody annotation, like this:
@RequestMapping(value = "/status", method = RequestMethod.GET)
@Transactional(readOnly = true)
public @ResponseBody Response<StatusVM> status()
我需要在返回响应后对每个控制器执行操作。此操作将使用新数据丰富Response对象。
I need to perform an operation on every controller, after the Response is returned. This operation will enrich the Response object with new data.
我不想重复代码,所以我需要一个单点干预。我想我可以这样做的拦截器,但是,根据文档 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor 这不适用于@ResponseBody :
I don't want to duplicate code, so I need a single point of intervention. I thought I could do this with Interceptors, however, according to the docs http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor this does not work well with @ResponseBody:
请注意,HandlerInterceptor的postHandle方法并不总是适用于@ResponseBody和ResponseEntity方法。在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得不可能更改响应,例如添加头。相反,应用程序可以实现ResponseBodyAdvice,并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上进行配置。
我无法找到
作为一个替代方法,我可以使用方面,但是我需要注释每个控制器,这是一个我'
As an alternative I could work with aspects, but then I'd need to annotate every controller, which is something I'd like to avoid.
推荐答案
最后我实现了ResponseBodyAdvice:
In the end I implemented ResponseBodyAdvice like this:
@ControllerAdvice
public class StatusAdvice implements ResponseBodyAdvice<Response<?>> {
@Override
public boolean supports(MethodParameter returnType,
Class<? extends HttpMessageConverter<?>> converterType) {
if (returnTypeIsReponseVM(returnType)&&responseConverterIsJackson2(converterType)){
return true;
}
return false;
}
....
@Override
public Response<?> beforeBodyWrite(Response<?> body, MethodParameter returnType,
MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
....
return body;
}
}
这篇关于Spring MVC中的Json响应的后处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!