早期对于异常的全局处理是在配置中写的,如下:
<!-- 全局异常配置 start -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">errors/error</prop>
<prop key="java.lang.Throwable">errors/err</prop>
</props>
</property>
<property name="statusCodes">
<props>
<prop key="errors/error">500</prop>
<prop key="errors/404">404</prop>
</props>
</property>
<!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 -->
<property name="warnLogCategory" value="WARN"></property>
<!-- 默认错误页面,当找不到上面mappings中指定的异常对应视图时,使用本默认配置 -->
<property name="defaultErrorView" value="errors/error"></property>
<!-- 默认HTTP状态码 -->
<property name="defaultStatusCode" value="500"></property>
</bean>
<!-- 全局异常配置 end -->
但现在spring3.0注解很方便强大,所以更多的开发者都倾向于用注解来代替原来繁琐的配置,而对于异常也有相应的注解,我个人并不觉得在配置文件中配置全局异常很麻烦,如果整个项目都用了注解,而你再用配置就显得不伦不类,所以就用一个简单的方法来代替。写一个公共的controller,用@ExceptionHandler来拦截异常,然后此controller被其他controller继承,这样就用很少的代码解决异常拦截的问题,公共controller代码如下:
@Controller
public class ExceptionHandlerController {
@ExceptionHandler(RuntimeException.class)
public String operateExp(RuntimeException ex,HttpServletRequest request){
System.out.println("this is for test");
//mod.addAttribute("err", ex.getMessage()); //ExceptionHandler处理异常时,Model,是不能用的,否则会不起作用,这里用了HttpServletRequest
request.setAttribute("err", ex.getMessage());
return "public/error";
}
}