【问题标题】:spring mvc interceptor: access to ResponseEntity in postHandlespring mvc拦截器:访问postHandle中的ResponseEntity
【发布时间】:2012-04-18 14:38:36
【问题描述】:

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

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

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

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

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

谢谢, 杰森

【问题讨论】:

    标签: rest spring-mvc interceptor


    【解决方案1】:

    当你写下你的问题时,我认为这是不可能的,但现在它是。 来自他们的文档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 上进行配置"

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        【讨论】:

        猜你喜欢
        • 2014-05-19
        • 2011-12-24
        • 1970-01-01
        • 2014-08-27
        • 2013-06-21
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        相关资源
        最近更新 更多