springboot全局异常处理

  项目中遇到运行时异常,总不能每个异常处理都去添加try catch逻辑,甚至有的时候一个偶然条件发生而导致异常,而我们没有进行对应的处理则会直接给请求者返回未知的错误,这在正式的上线的项目中是不允许,所以我们来配置全局异常处理。

  1、使用到的注解:@ControllerAdvice注解是用来配置控制器通知的,我们可以配置过滤拦截具体一种或者多种类型的注解,添加annotations属性即可,在类的上方我们配置了@ControllerAdvice的annotations属性值为RestController.class,也就是只有添加了@RestController注解的控制器才会进入全局异常处理;因为我们全局返回的都是统一的Json格式的字符串,所以需要再类上配置@ResponseBody注解;@ExceptionHandler注解用来配置需要拦截的异常类型,默认是全局类型,可以通过value属性配置只对某个类型的异常起作用;@ResponseStatus注解用于配置遇到该异常后返回数据时的StatusCode的值,我们这里默认使用值500;

  RestExceptionHandler配置代码如下

package com.example.demo;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@ControllerAdvice(annotations=RestController.class)
@ResponseBody
public class RestExceptionHandler {

	@ExceptionHandler
//	@ExceptionHandler(value= {NumberFormatException.class}),只会在发生NumberFormatException时起作用
	@ResponseStatus
	public ResponseBean exceptionHandler(Exception e) {
		ResponseBean rb = new ResponseBean();
		rb.setStatus(false);
		rb.setMsg(e.getMessage());
		return rb;
	}
}

  2、响应实体类

package com.example.demo;

public class ResponseBean {
	private boolean status;
	private String msg;
	private Object data;
	public boolean getStatus() {
		return status;
	}
	public void setStatus(boolean status) {
		this.status = status;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
}

  3、测试控制器类

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

	@GetMapping("/index")
	public Object index() {
		ResponseBean rb = new ResponseBean();
		rb.setStatus(true);
		rb.setMsg("response success");
		//从service层获取到数据
		rb.setData("正常响应的数据");
		return rb;
	}
	@GetMapping("/secend")
	public Object secend(int number) {
		if(number ==1) {
			throw new ArrayIndexOutOfBoundsException("数组下标越界");
		}
		ResponseBean rb = new ResponseBean();
		rb.setStatus(true);
		rb.setMsg("response success");
		//从service层获取到数据
		rb.setData("正常响应的数据");
		return rb;
	}
	@GetMapping("/third")
	public Object third(int number) {
		if(number ==1) {
			throw new NumberFormatException("转化异常");
		}
		ResponseBean rb = new ResponseBean();
		rb.setStatus(true);
		rb.setMsg("response success");

		rb.setData("正常响应的数据");
		//从service层获取到数据,抛出
		return rb;
	}
	@GetMapping("/four")
	public Object four(int number) throws ClassNotFoundException {
		if(number ==1) {
			throw new ClassNotFoundException ("类找不到异常");
		}
		ResponseBean rb = new ResponseBean();
		rb.setStatus(true);
		rb.setMsg("response success");

		rb.setData("正常响应的数据");
		//从service层获取到数据,抛出
		return rb;
	}
}

  4、pom文件引入web启动包即可,启动类SpringbootExceptionApplication默认即可。

  启动项目,访问http://localhost:8080/index,得到正常的响应   {"status":true,"msg":"response success","data":"正常响应的数据"};访问http://localhost:8080/secend?number=1,得到异常处理的响应{"status":false,"msg":"数组下标越界","data":null};其它示例也都是预想中结果。

原文地址:https://www.cnblogs.com/hhhshct/p/9250724.html

时间: 2024-11-05 13:03:58

springboot全局异常处理的相关文章

springboot 全局异常处理

springboot 全局异常处理 研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp 针对500错误 创建单独的配置类,放在启动类同包或子包下 import org.springframework.web.bind.annotation.ControllerAd

zbb20180921 springboot 全局异常处理 404 500

研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp 针对500错误 创建单独的配置类,放在启动类同包或子包下 import org.springframework.web.bind.annotation.ControllerAdvice; import org.s

第二十三章 springboot + 全局异常处理

一.单个controller范围的异常处理 1 package com.xxx.secondboot.web; 2 3 import org.springframework.web.bind.annotation.ExceptionHandler; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMeth

SpringBoot2.0系列教程(五)Springboot框架添加全局异常处理

Hello大家好,本章我们添加全局异常处理.另求各路大神指点,感谢 一:为什么需要定义全局异常 在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,所以我们需要对异常进行捕获,然后给予相应的处理,来减少程序异常对用户体验的影响 二:添加业务类异常 在前面说过的ret文件夹下创建ServiceException package com.example.demo.core.ret; import java.io.Seriali

springboot结合全局异常处理之登录注册验证

在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回JSON数据. 方法有很多,这觉得用全局异常处理比较容易上手 全局异常处理 首先来创建一个sprIngboot的web项目或模块,目录结构如下 实体类User.java @Data public class User { private String userName; private String passwold; } 实体类UserResult.java 把数据封装到这里返回

SpringBoot入门二十一,全局异常处理

一共两个文件,一个处理全局异常,保存信息到日志,另外一个负责返回异常信息给接口,只要将其文件添加到项目中,无需再做其他配置即可 1. MyExceptionHandler.java 全局异常处理类 优先执行此类,这里不好抓取404.403等错误信息getMaps()请参考获取request中传递过来的参数信息getHeaders()请参考获取request中传递过来的header信息代码如下: import java.util.Enumeration; import java.util.Hash

Springboot的异常处理与自定义异常

园友们好,元旦很快就到来了,提前祝各位园友们元旦快乐,今天给大家分享一个工作中必用一个知识点,就是使用枚举构建自定义异常并应用于springboot的异常处理器.开始之前我先把这个案例的结构大致说明一下: 1.使用idea创建一个springboot的Gradle/Maven项目,引入web模块即可(由于案例的重点是异常处理,所以跳过其他操作). 2.创建一个javabean,用来接收前台的参数. 3.创建一个枚举.封装异常的错误码等信息. 4.创建一个自定义异常类继承RuntimeExcept

Struts2全局异常处理

1.在struts.xml中配置全局异常处理 在Action中抛出异常,此异常可以是action自己抛的,也可以是Service抛出来的,都会跳转到全局异常中,只有在当前Action中配置域全局异常返回的result中name相同的result,就能跳转到指定错误视图 并在struts.xml中对应Action中配置跳转的error视图: JSP中通过Struts标签并结合OGNL表达式从值栈中获取懂啊异常信息显示出来,如果不知道值栈中异常对象的名称可以先<s:debugger>看一下,如:

服务端增加WCF服务全局异常处理机制

转自:http://www.csframework.com/archive/1/arc-1-20150109-2193.htm 服务端增加WCF服务全局异常处理机制,任一WCF服务或接口方式出现异常,将统一调用WCF_ExceptionHandler.ProvideFault方法,因此不需要每个方法使用try catch写法. 1 /// <summary> 2 /// WCF服务端异常处理器 3 /// </summary> 4 public class WCF_Exceptio