Spring MVC中的Json响应的后处理 [英] Post processing of a Json response in spring MVC

查看:924
本文介绍了Spring MVC中的Json响应的后处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个控制器返回相同的通用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆