spring boot的异常处理
原文:https://blog.csdn.net/tianyaleixiaowu/article/details/70145251
全局异常处理是个比较重要的功能,一般在项目里都会用到。
我大概把一次请求分成三个阶段,来分别进行全局的异常处理。
一:在进入Controller之前,譬如请求一个不存在的地址,404错误。
二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。
三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。
第一种情况:
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by wuwf on 17/4/12.
*/
@RestController
public class FinalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value = "/error")
public Object error(HttpServletResponse resp, HttpServletRequest req) {
// 错误处理逻辑
return "其他异常";
}
}
第二种情况:
使用@ControllerAdvice
/**
* Created by wuwf on 17/3/31.
* 全局异常处理
*/
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger logger = LogManager.getLogger(GlobalExceptionHandler.class.getName());
// @ExceptionHandler(value = Exception.class)
// public ModelAndView defaultHandler(HttpServletRequest request, Exception e) throws Exception {
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.addObject("exception", e);
// modelAndView.addObject("url", request.getRequestURL());
// modelAndView.setViewName("error");
// return modelAndView;
// }
/**
* 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
System.out.println("错误");
return new ResponseEntity<Object>("出错了", NOT_EXTENDED);
}
}
定义一个类,使用@ControllerAdvice注解,继承ResponseEntityExceptionHandler类,这个类里面实现了很多方法,可以去看看,包括一些参数转换,请求方法不支持等等之类的异常都会被捕获。
被捕获的原因是@ExceptionHandler标签,里面所有的异常类只要发生了,就会被这个方法所捕获。
第三种情况:
当第一、第二种都没出异常,进入到实际逻辑执行了,然后发生了异常,这样就可以自己定义一个ExceptionHandler的方法,来处理相应的Exception。
/**
* Created by wuwf on 17/3/31.
* 全局异常处理
*/
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger logger = LogManager.getLogger(GlobalExceptionHandler.class.getName());
// @ExceptionHandler(value = Exception.class)
// public ModelAndView defaultHandler(HttpServletRequest request, Exception e) throws Exception {
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.addObject("exception", e);
// modelAndView.addObject("url", request.getRequestURL());
// modelAndView.setViewName("error");
// return modelAndView;
// }
/**
* 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
System.out.println("错误");
return new ResponseEntity<Object>("出错了", NOT_EXTENDED);
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ErrorInfo<String> jsonHandler(HttpServletRequest request, Exception e) throws Exception {
ErrorInfo<String> r = new ErrorInfo<>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData("发生异常");
r.setUrl(request.getRequestURL().toString());
log(e, request);
return r;
}
private void log(Exception ex, HttpServletRequest request) {
logger.error("************************异常开始*******************************");
// if(getUser() != null)
// logger.error("当前用户id是" + getUser().getUserId());
logger.error(ex);
logger.error("请求地址:" + request.getRequestURL());
Enumeration enumeration = request.getParameterNames();
logger.error("请求参数");
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
logger.error(name + "---" + request.getParameter(name));
}
StackTraceElement[] error = ex.getStackTrace();
for (StackTraceElement stackTraceElement : error) {
logger.error(stackTraceElement.toString());
}
logger.error("************************异常结束*******************************");
}
}
上面都是restful的情况,返回个json。对于要返回view的按下面的处理。
@Component
public class ExceptionHandler implements HandlerExceptionResolver {
private static Logger log = LoggerFactory.getLogger(ExceptionHandler.class);
@Override
public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) {
// 异常处理逻辑 goes here
log.info("got exception: {}", ex.getClass());
return new ModelAndView("pc/500");
}
}
从SpringMVC源码中可知,DispatcherServlet中如果产生了异常,则接下来会在processDispatchResult()方法中查询当前容器中是否有HandlerExceptionResolver接口的实现类,如果有则调用它的resolveException()方法,得到返回的View,如果没有则使用框架默认的异常处理类。
导入包
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-starter-data-rest')
compile('org.springframework.boot:spring-boot-starter-freemarker')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.boot:spring-boot-starter-web-services')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compile('org.springframework.boot:spring-boot-starter-log4j2:2.0.3.RELEASE')
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compileOnly('org.projectlombok:lombok')
runtime('mysql:mysql-connector-java')
compile ('com.alibaba:fastjson:1.2.47')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile ('org.apache.shiro:shiro-spring:1.3.2')
compile('com.github.pagehelper:pagehelper-spring-boot-starter:1.2.3')
compile ('com.google.guava:guava:18.0')
compile 'org.apache.commons:commons-lang3:3.7'
compile 'org.apache.shiro:shiro-core:1.4.0'
compile 'org.springframework:spring-context:5.0.7.RELEASE'
compile 'javax.servlet:javax.servlet-api:3.1.0'
spring boot的异常处理的更多相关文章
- Spring Boot全局异常处理
本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下 1.后台处理异常 a.引入thymeleaf依赖 <!-- thymeleaf模板插件 --> <dep ...
- spring boot 统一异常处理
需求源自于任何一个业务的编写总会有各种各样的条件判断,需要时时手动抛出异常,又希望让接口返回友好的错误信息. spring boot提供的帮助是自动将异常重定向到路由为/error的控制器 但是我们又 ...
- Spring Boot统一异常处理实践
摘要: SpringBoot异常处理. 原文:Spring MVC/Boot 统一异常处理最佳实践 作者:赵俊 前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多 ...
- Spring Boot 全局异常处理
Spring Boot版本 1.5 @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExcept ...
- spring boot 全局异常处理及自定义异常类
全局异常处理: 在处理controller层抛出的自定义异常时,可以实现@ControllerAdvice注解捕获,配合@ExceptionHandler来增强所有的@requestMapping方法 ...
- Spring Boot统一异常处理方案示例
一.异常处理的原则 1.调用方法的时候返回布尔值来代替返回null,这样可以 NullPointerException.由于空指针是java异常里最恶心的异常. 2. catch块里别不写代码.空ca ...
- Spring Boot☞ 统一异常处理
效果区: 代码区: package com.wls.integrateplugs.exception.dto; public class ErrorInfo<T> { public st ...
- 如何使用 Spring Boot 实现异常处理?
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法. 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常.
- spring boot(15)-异常处理
异常传递 如图:服务层和dao层的异常最终都会到达控制层,控制层的异常则会自动记入logback日志系统.所以我们应该在控制层来捕获系统异常 捕获控制层异常 import org.slf4j.Logg ...
随机推荐
- Autofac 应用于IIS托管的WEB程序,注册程序集被回收的问题
现项目开始全面接入Autofac,但上线了后发现,iis进程被回收后,在访问网页提示找不到注册在Autofac中的类型,或者实例.现在处理办法记录如下: 1. IIS托管的应用程序,在首次加载时,所有 ...
- scrapy简单使用方法
scrapy简单使用方法 1.创建项目:scrapy startproject 项目名例如:scrapy startproject baike windows下,cmd进入项目路径例如d:\pytho ...
- [Linux] 纯净ubuntu系统仓库更换为阿里云的源
1.先apt-get update一下当前默认的源,更新完成后先把vim命令安装一下,再修改源仓库为阿里云,否则无法直接编辑文件 2.先添加阿里云的源,编辑文件/etc/apt/sources.lis ...
- Wireshark抓包笔录--之指定IP地址筛选捕获结果
Wireshark安装 1.去官网下载相应的安装包 地址如下:https://www.wireshark.org/ 2.安装步骤,一路next,需要同意的地方点同意 3.安装完成后打开软件,如下: W ...
- 《大话处理器》Cache一致性协议之MESI【转】
转自:https://blog.csdn.net/muxiqingyang/article/details/6615199 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...
- 提升ML.NET模型的准确性
ML.NET是一个面向.NET开发人员的开源.跨平台的机器学习框架. 使用ML.NET,您可以轻松地为诸如情绪分析.价格预测.销售分析.推荐.图像分类等场景构建自定义机器学习模型. ML.NET从0. ...
- pymongo 笔记(转)
1. 安装MongoDB并启动服务,安装PyMongo2. 连接MongoDB,并指定连接数据库.集合 import pymongo client = pymongo.MongoClient(host ...
- angular 使用ng-zorro的from组件 运行报错
emplate parse errors: Can't bind to 'formGroup' since it isn't a known property of 'form'. 原因:没有导入表单 ...
- mysql数据库的创建问题
数据库客户端工具navicate 1.使用create database语句创建数据库 (1)指定字符集 create [database|schema ]if not exists 数据库名 def ...
- 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...