Spring MVC提供了处理异常和错误的好方法。@ExceptionHandler注释是此功能的核心。对于每个Spring控制器,我们可以简单地定义一个方法,如果给定的异常发生,它将自动调用。例如:
import org.springframework.web.bind.annotation.ExceptionHandler;
//..
@ExceptionHandler(IOException.class)
public String exception(Exception e) {
//..
return "error";
}
因此,每当从任何控制器方法引发IOException时,将调用上述方法exception()
。我们使用@ExceptionHandler
注释将IOException.class
映射到此方法。
这个注释的一个缺点是,它只处理从被定义的控制器引发的异常,不会处理从其他控制器引发的异常。
这个注解用来定义@ExceptionHandler
,@InitBinder
以及@ModelAttribute
适用于所有@RequestMapping
方法的方法。
import org.springframework.web.bind.annotation.ControllerAdvice;
//..
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(Exception.class)
public String exception(Exception e) {
return "error";
}
}
因此,如果我们在@ControllerAdvice
类中定义了@ExceptionHandler
方法的注释,它将被应用于所有控制器。
值得注意的一点是,Spring配置必须定义mvc命名空间才能识别@ControllerAdvice
注释。因此,必须在spring-servlet.xml
文件中定义以下内容。
<mvc:annotation-driven/>
如果已经定义了<context:annotation-config />
它将不起作用。@ControllerAdvice
将不会被加载。所以永远记得在Spring配置中使用<mvc:annotation-driven/>
。