2024.10月12日--- SpringMVC异常处理

异常处理

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注解实现异常处理

  1. 编写如下方法

  2. 在方法上添加注解

  3. 其他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;

}

}

相关推荐
JAVA学习通1 小时前
北京明光云振铎数据科技Java面经
java·开发语言·科技
贫民窟的勇敢爷们7 小时前
SpringBoot整合AOP切面编程实战,实现日志统一记录+接口权限校验
java·spring boot·spring
jerryinwuhan7 小时前
基于各城市站点流量的复合功能比较
开发语言·php
AC赳赳老秦8 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
迈巴赫车主8 小时前
Java基础:list、set、map一遍过
java·开发语言
灵犀学长9 小时前
基于 Spring ThreadPoolTaskScheduler + CronTrigger 实现的动态定时任务调度系统
java·数据库·spring
南 阳9 小时前
Python从入门到精通day66
开发语言·python
好家伙VCC10 小时前
【无标题】
java
十八旬10 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
前进的李工11 小时前
EXPLAIN输出格式全解析:JSON、TREE与可视化
开发语言·数据库·mysql·性能优化·explain