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;

}

}

相关推荐
湫ccc17 分钟前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐17 分钟前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi771 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做3431 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀1 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20202 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea