使用SpringMVC提供的@ControllerAdvice,@ExceptionHandler可以方便的实现全局异常处理器.
不仅方便,可以更细粒度的控制各种异常.
首先创建一个全局异常处理类:
/**
* Created with IntelliJ IDEA.
*
* @author: ChuRuo Xu
* 注解全局异常处理器
*/
@ControllerAdvice
public class AnnotationExceptionHandler {
// 自定义异常
@ExceptionHandler(CustomException.class)
public ModelAndView customerExceptionHandler(CustomException customerException) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", customerException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
// 系统异常
@ExceptionHandler(Exception.class)
public ModelAndView Exception(Exception e) {
//获取日志记录器,这个记录器将负责控制日志信息
Logger logger = Logger.getLogger(AnnotationExceptionHandler.class.getName());
//使用Logger对象的debug、info方法输出日志信息
logger.info(e.getMessage());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "服务器异常!请稍后再试!");
modelAndView.setViewName("error");
return modelAndView;
}
}
自定义异常类继承RuntimeException重写方法即可,idea使用ctrl+o
之所以继承RuntimeException,忘记了....哈哈,大概是对于Spring来说比继承exception更好
/**
* Created with IntelliJ IDEA.
*
* @author: ChuRuo Xu
* 自定义异常处理器
*/
public class CustomException extends RuntimeException {
public CustomException() {
super();
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable cause) {
super(message, cause);
}
public CustomException(Throwable cause) {
super(cause);
}
protected CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
最重要的一步,在springmvc.xml配置文件中扫描注解包
<!-- 扫描controller注解,多个包使用[,]分割 -->
<context:component-scan base-package="com.springmvc.exception"/>
这样就可以了,测试后无问题.附上其他代码:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<!-- 前缀 -->
<property name="prefix" value="/jsp/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
log4j.properties:
# 定义 DEBUG 优先级, R 为日志输出目的的
log4j.rootLogger= DEBUG, R
# 设置日志输出类型 , 为文件类型
log4j.appender.R= org.apache.log4j.FileAppender
# 设置日志文件的位置
log4j.appender.R.file=F:\\logRecord.log
# 每次在文件尾写入新的日志信息
log4j.appender.R.Append= true
# 日志输出信息格式类型
log4j.appender.R.layout= org.apache.log4j.PatternLayout
# 日志输出信息格式为 换行、日期、优先级、 [ 全类名 ] 、日志信息、换行
log4j.appender.R.layout.ConversionPattern= %n%d%p [%l] %m%n