全局异常捕获
在springboot中看了之前的一篇就知道异常有多重要了
全局异常方法类
@ControllerAdvice
public class GlobalExceptionHandlerResolver {
// @ExceptionHandler(value = Exception.class)
// @ResponseBody
// public Map<String,Object> exceptionHandler(Exception e){
// Map<String,Object> map = new HashMap<>();
// map.put("code",500);
// map.put("msg","系统异常请重试");
//
// //判断是否是指定异常
// if(e instanceof ParamsException){
// ParamsException p = (ParamsException) e;
// map.put("code",p.getCode());
// map.put("msg",p.getMsg());
// }
// return map;
// }
/**
* 处理特定的异常
*/
@ExceptionHandler(value = ParamsException.class)
@ResponseBody
public Map<String,Object> exceptionHandler02(ParamsException p){
Map<String,Object> map = new HashMap<>();
map.put("code",p.getCode());
map.put("msg",p.getMsg());
return map;
}
/**
* 处理数据校验字段的异常
*/
@ExceptionHandler(value = BindException.class)
@ResponseBody
public Map<String,Object> exceptionHandler03(BindException b){
Map<String,Object> map = new HashMap<>();
map.put("code",500);
map.put("msg",b.getBindingResult().getFieldError().getDefaultMessage());
return map;
}
}
第一个注解@ControllerAdvice注解
组合了@Component注解 就是作为全局异常处理类的切面类 同时可以指定扫描包的范围
第二个注解@ExceptionHandler
这个在处理异常时标注在方法级别 代表当前方法处理的异常类
这样如果有对应的异常发生就会被handler捕获然后做对应的方法处理
自定义方法异常
paramerException
创建对应service层对应的exception类
package com.heyongqiang.ecxeptions;
public class ParamsException extends RuntimeException{
private Integer code = 500;
private String msg = "参数错误";
public ParamsException(){
super("参数异常");
}
public ParamsException(String msg){
super(msg);
this.msg = msg;
}
public ParamsException(Integer code){
super("参数异常!");
this.code = code;
}
public ParamsException(Integer code,String msg){
super(msg);
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
需要继承RuntimeException
这里的自定义属性可以是map中的键值 也可以是resultinfo的具体属性
数据校验(BindException) 如果注解出错则会抛出该异常
在web环境导入的时候就引入了validation数据校验
只要在实体类的属性上加上对应的注解就可以
@NotBlank(message = "用户姓名不能为空")
private String userName;//用户名称
@NotBlank(message = "用户密码不能为空")
@Length(min = 4, max = 10 , message = "用户密码长度为4~10位")
private String userPwd;//用户密码
@Email(message = "用户邮箱格式不正确")
private String userEmail;//用户邮箱
这里的message就是异常的提示信息
在全局异常方法类中使用
map.put(“msg”,b.getBindingResult().getFieldError().getDefaultMessage());
对应的方法就可以提取出message信息
方法类 AsserUtil
public class AsserUtil {
/**
* 如果字符串是空就抛出一个异常类
* @param flag
* @param msg
*/
public static void isTrue(Boolean flag,String msg){
if(flag){
throw new ParamsException(msg);
}
}
}
如题
这样就可以解放service层的方法代码
正确执行:
请求正常返回controller层然后返回给前端
发生异常
首先错误的判断会在util方法类中被发现 然后没有符合条件的工具栏就会抛出对应的异常
throw new ParamsException(msg);
然后这个异常就会被全局异常方法类给捕获
@ExceptionHandler(value = ParamsException.class)
这里就不会回到controller层了而是返回你想要定义的异常事件处理