【问题标题】:ModelAndView null in Interceptor when Exception mapped from SimpleMappingExceptionResolver当从 SimpleMappingExceptionResolver 映射异常时,拦截器中的 ModelAndView 为空
【发布时间】:2012-07-15 11:39:53
【问题描述】:

好的,所以我在一个使用 spring 的项目中,据我所知,何时引发运行时异常并由 SimpleMappingExceptionResolver 处理,然后当我们注册的拦截器的 postHandle 方法被调用时,它带有空模型和视图。

我不太了解spring MVC如何挂在一起,但我认为SimpleMappingExceptionResolver将异常类型映射到ModelAndView。并且这个 ModelAndView 对象可用于拦截器将内容填充到模型中。如果不是这种情况,请随时告诉我为什么,如果是,为什么我在拦截器中看到 null ModelAndView?

干杯,克里斯。

【问题讨论】:

  • 在成功调用 handler.handle 后调用 postHandle 方法。 postHandle 在处理程序引发异常的情况下不会被调用。在这种情况下,只有在异常解析器调用之后才会调用 afterCompletion 拦截器方法。我不知道在引发异常的情况下如何调用 postHandle。
  • 另外,如果您查看 org.springframework.web.servlet.DispatcherServlet#doDispatch 源,很容易理解拦截器/解析器的工作原理

标签: spring spring-mvc exception-handling interceptor


【解决方案1】:

我正在扩展@masted 的评论。实际上Interceptor没有被调用,当请求被ExceptionResolver处理并且根据documentation视图渲染后调用HanlerInterceptor#afterCompletion方法,所以它也对我们没有帮助。

我对此的解决方案是创建我自己的 ExceptionHandler 扩展 AbstractHandlerMethodExceptionResolver 并自动连接我的拦截器。然后在将视图名称设置为我的ModelAndView 并将异常放在那里之后,我调用我的拦截器的postHandle() 方法。

它相对干净,是我让它工作的唯一方法。

【讨论】:

    【解决方案2】:

    我不确定我们是否有相同的情况,但是对于我的情况,当系统因为 ModelAndView 为空而无法解析 View 时,我想显示一个页面,通知“404 请求未找到”。最初,我尝试使用 SimpleMappingExceptionResolver 并将“404 请求未找到”的视图名称放入地图(视图名称称为“/404NotFound”)。但我找不到正确的异常。

    最后,我为解决我的问题所做的是修改 web.xml 并将其放入:

        <error-page>
        <error-code>404</error-code>
        <location>/404NotFound</location>
        </error-page>
    

    由于我们不需要任何控制器来处理 404NotFound(直接渲染它),我将这段代码放在 mvc 的应用程序上下文中。

        <mvc:view-controller path="/404NotFound"/>
    

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多