spring mvc interceptor:访问postHandle中的ResponseEntity

时间:2012-04-04 20:26:39

标签: rest spring-mvc interceptor

我有一个拦截器记录了Spring MVC响应的结果。我的所有响应都返回具有JSON正文内容的ResponseEntity对象。

我想从ResponseEntity中获取响应正文和http状态。

如何从postHandle方法属性访问ResponseEntity?

public void postHandle(HttpServletRequest request, 
    HttpServletResponse response, 
    Object handler, 
    ModelAndView modelAndView) {}

对于我的调用,modelAndView属性为null。

谢谢, 杰森

3 个答案:

答案 0 :(得分:3)

当你写下你的问题时,我认为这是不可能的,但现在却是。 来自他们的文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

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

答案 1 :(得分:2)

我找到了一个完整的解决方案和一个部分解决方案。

部分解决方案: 对于那些使用Servlet 3.0的用户,HttpServletResponse对象上提供了HTTPStatus代码。这可以解决我的一半问题,因为我可以获取状态代码,但它仍然没有让我访问具有我想要检查的body属性的ResponseEntity。

完整解决方案(适用于Servlet 2.x): 我使用了Aspect和拦截器的组合。

Aspect被编码为针对返回ResponseEntities的控制器方法的@AfterReturn。它基本上捕获了返回的responseEntity并将其放在ThreadLocal< ResponseEntity>中。采集。

然后,拦截器向Aspect询问线程的响应和TA-DAH是否可访问。

我希望这个答案有助于其他人。 干杯, 杰森

答案 2 :(得分:2)

@ControllerAdvice
public class ResponseDTOFilterAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(final MethodParameter returnType, final Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(final Object body, final MethodParameter returnType, final MediaType selectedContentType,
        final Class<? extends HttpMessageConverter<?>> selectedConverterType, final ServerHttpRequest request,
        final ServerHttpResponse response) {
        if (body instanceof ResponseDTO<?>) {
            ResponseDTO<?> responseDTO = (ResponseDTO<?>) body;
            responseDTO.setHostname(request.getLocalAddress().getHostName());
        }
        return body;
    }
}

来源:Post processing of a Json response in spring MVC