Spring Boot入门4——统一异常处理

对于前面一篇所讲到的表单验证中提到,如果产生错误,可以得到错误的信息,但是返回值的问题却没有考虑。

其中所提到的Controller:

@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
public @ResponseBody User doRegister(@Valid User user, BindingResult result, Model model) {
	if (result.hasErrors()) {
		List<ObjectError> list = result.getAllErrors();
		for (ObjectError error : list) {
			System.out.println(error.getDefaultMessage());
		}
		return null;
	}
	System.out.println("注册..");
	return user;
}


如果验证不通过,我们不应该返回null的,这会对前端来说并不友好。

所以我们应该定义一个统一的返回格式:

public class ReturnType {
	
	private int code;
	private User data;
	private String msg;
	
	public ReturnType(int code, String msg, User data) {
		this.code = code;
		this.msg = msg;
		this.data = data;
	}
	
	public int getCode() {
		return code;
	}
	public void setCode(int code) {
		this.code = code;
	}
	public User getData() {
		return data;
	}
	public void setData(User data) {
		this.data = data;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	
}
这样一来,返回的结果中的json的格式是固定的。


虽然我们的希望是好的,但是并不是总是可以这样的,因为不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。

如果存在下面这种情况:

@RequestMapping(value = "/doRegister", method = RequestMethod.POST)
public @ResponseBody ReturnType doRegister(@Valid User user, BindingResult result, Model model) throws Exception {
	throw new Exception("new Exception");
}
这就好像在调用Service层代码的时候,执行方法的过程中遇到了一个异常,那么回得到什么样的结果呢?

无论如何,返回的肯定不是我们之前定义好的格式的返回值。


那我们应该怎么做呢?

这里就需要进行统一的异常处理了。

@ControllerAdvice  
public class ExceptionHandle {
	
	/* 表明这个handler只处理什么类型的异常
	 * */
	@ExceptionHandler(value = Exception.class)
	// 返回值为json或者其他对象
	@ResponseBody
	public ReturnType handle(Exception e) {
		return new ReturnType(-1, e.getMessage(), null);
	}
}
创建这么一个handler类,当Controller抛出异常的时候,就会委托给这个类其中的方法进行执行。


这样一来,就不会出现即使抛出异常,也不会得到不是我们期望的返回值的结果了。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值