使用Spring MVC,您可以让一个控制器调用另一个控制器来处理错误页面吗?

时间:2016-02-10 11:46:21

标签: spring jsp spring-mvc

我有一个可以抛出异常的控制器。当它抛出异常时它将显示我的errorpage.jsp,而不是我想要显示的jsp页面。该控制器的一个例子是:

public class myController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, Object> model = new HashMap<>();
        // Some logic which can throw an error....

        return model;
    }
}

application-servlet.xml如下所示:

...
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/login.html">myController</prop>
            <prop key="/errorpage.html">myErrorController</prop>
        </props>
    </property>
</bean>
...

通常,当出现错误(如导航到不存在的页面)时,将调用错误控制器,该错误控制器将返回错误页面jsp的变量的散列图。但是,当登录控制器遇到错误时,它将显示错误页面,但它不会调用提供这些参数的错误控制器,因此页面不完整。

有没有办法在servlet.xml中定义myController在遇到错误时调用myErrorController并重定向到错误页面?

1 个答案:

答案 0 :(得分:3)

您可以使用@ControllerAdvice注释控制器类,它将在所有控制器之间共享。然后使用@ExceptionHandler注释,您可以创建处理特定异常的方法。

示例:

@ControllerAdvice
public class ExceptionHandlerAdvice {

    @ExceptionHandler(MyException.class)
    public ModelAndView handleException(MyException e, HttpServletRequest request, HttpServletResponse response) { // included servlet request and response
        ModelAndView model = new ModelAndView("error/errorpage.jsp");
        model.addObject("exception", e);
        return model;
    }

}

无论何时在任何其他控制器中抛出MyException,此控制器通知方法都将为您处理异常!作为例外,servlet请求和响应被传递给ExceptionHandler方法,所有这些信息都可供您使用。

另一个控制器中的示例:

@Controller
public class SomeController {

   @Autowired
   private DataService dataService;

   @RequestMapping(value = '/', method = RequestMethod.POST)
   public String doSomething() {
      return dataService.foobar(); // throws MyException which is handled with ExceptionHandler
   }

}