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

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


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

我不想重复代码,因此我需要单点干预。我以为我可以使用Interceptors做到这一点,但是,根据文档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上对其进行配置。

我没有找到这种技术的例子,有人可以帮我吗?

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

最佳答案

最后,我像这样实现了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;
    }

}


因此,这比预期的要容易。

关于json - 在Spring MVC中对Json响应进行后处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26756811/

10-10 14:10