在Spring MVC中对Json响应进行后处理

 Rozenia 发布于 2022-12-13 01:39

我有几个控制器使用@ResponseBody注释返回相同的通用Response对象,如下所示:

@RequestMapping(value = "/status", method = RequestMethod.GET)
    @Transactional(readOnly = true)
    public @ResponseBody Response status()

在返回Response之后,我需要在每个控制器上执行操作.此操作将使用新数据丰富Response对象.

我不想重复代码,所以我需要单点干预.我认为我可以用拦截器做到这一点,但是,根据文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor这样做与@ResponseBody不协调:

请注意,HandlerInterceptor的postHandle方法并不总是非常适合与@ResponseBody和ResponseEntity方法一起使用.在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得无法更改响应,例如添加标头.相反,应用程序可以实现ResponseBodyAdvice并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上配置它.

我无法找到这个技术的例子,有人可以帮助我吗?

作为替代方案,我可以使用方面,但是我需要注释每个控制器,这是我想要避免的.

1 个回答
  • 最后我实现了ResponseBodyAdvice,如下所示:

    @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;
        }
    
    }
    

    所以它比预期更容易.

    2022-12-13 02:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有