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;

}

}

相关推荐
cfm_29142 分钟前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统1 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
C++ 老炮儿的技术栈1 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011161 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据1 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
0x532 小时前
Java网络编程(二)
java·服务器·网络
zlinear数据采集卡2 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Flittly2 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai2 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间2 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing