异常处理
SpringMVC处理异常的方式有三种,当然也可以使用AOP面向编程,自定义一个类进入切入。
第一种:使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
<!--SpringMVC提供的异常处理器类型:SimpleMappingExceptionResolver-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 异常映射属性: 是一个map散列表 用于配置不同异常跳转到不同页面 -->
<property name="exceptionMappings">
<props>
<!--key: 用于指定异常类型, value用于指定跳转的页面名称-->
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
第二种:实现HandlerExceptionResolver接口,自定义异常处理器,并注册
/**
* 用户【】 IP[]
* 在【时间】
* 操作【Controller.find】 发生如下异常
* xxxxxxxxxxxxxxxxxxxxx
* yyyyyyyyyyyyyyyyyyyyy
*
*/
package com.ssm.netctoss.util;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
System.out.println("---------执行了自定义异常处理器------------");
// 根据不同的异常类型,设置不同的响应状态码
if (e instanceof MyCustomException) {
response.setStatus(HttpStatus.BAD_REQUEST.value());
// 可以添加更多的自定义处理逻辑
System.out.println("-----");
}else if (e instanceof IllegalArgumentException) {
//
}else {
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
// 记录日志或其他处理逻辑
}
// 可以将异常信息放入模型中供视图展示
modelAndView.addObject("errorMessage", e.getMessage());
// 设置视图名称
modelAndView.setViewName("error");
return modelAndView;
}
}
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
xml配置文件添加:
<bean class="com.ssm.netctoss.util.MyExceptionResolver"/>
第三种:使用@ExceptionHandler注解实现异常处理
-
编写如下方法
-
在方法上添加注解
-
其他Controller继承即可
package com.ssm.netctoss.util;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletRequest;
public class BaseController {
@ExceptionHandler
public String executeEx(HttpServletRequest request,Exception e){
// request.setAttribute("msg", e.getMessage());
// request.setAttribute("code", 1);
System.out.println("---------------注解异常");
//根据不同异常类型,返回不同视图
return "error";
}
}
第四种:使用AOP,自定义异常处理类型
可以正常统一处理异常信息 并且 开启注解扫描,别忘记了
package com.ssm.netctoss;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.ssm.netctoss.pojo.Admin;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* 用户【】 IP[]
* 在【时间】
* 操作【Controller.find】 发生如下异常
* xxxxxxxxxxxxxxxxxxxxx
* yyyyyyyyyyyyyyyyyyyyy
*
*/
@Component
@Aspect
public class ExceptionLogger {
@Resource
private HttpServletRequest request;
@Around("within(com.ssm.netctoss.controller..*)")
public Object log(ProceedingJoinPoint p) throws Exception{
Object obj = null;
try {
obj = p.proceed();
} catch (Throwable e) {
// 记录异常信息
Admin admin = (Admin)request.getSession().getAttribute("LOGINADMIN");
String msg="";
if(admin!=null){
String adminCode = admin.getAdminCode();
String ip = request.getRemoteHost();
String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
String className = p.getTarget().getClass().getName();
String methodName = p.getSignature().getName();
msg+="用户["+adminCode+"],IP["+ip+"],在"+now+"],操作["+className+"."+methodName+"]时,发生如下异常:\n";
}
StackTraceElement[] elems = e.getStackTrace();
for(StackTraceElement elem:elems){
msg+="\t"+elem.toString()+"\n";
}
Logger logger = Logger.getLogger(ExceptionLogger.class);
logger.error(msg);
//记录日志后,抛出异常,交给后面的代码继续处理
throw new Exception(e);
}
return obj;
}
}