正常情况
我们先演示一下正常情况下我们验证的方法。
首先定义一个LoginBean
@Data
public class LoginBean {
// Blank 不允许保存空格,空格不算内容
@NotBlank(message = "用户名不能为空")
String username;
// Empty 允许保留空格,是空格也算内容
@NotEmpty(message = "密码不能为空")
String password;
}
定义一个处理错误信息的结果类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultBean {
int code;//状态码
String msg;//消息
Object data;//数据
}
定义一个控制抽象类
封装一些方法 成功 或者 失败 的处理方法
public abstract class BaseController {
// 设置接口响应状态码
private final int SUCCESS=200;
private final int FAIL=0;
protected ResultBean success(String msg){
return convert(SUCCESS,msg,null);
}
protected ResultBean success(String msg,Object data){
return convert(SUCCESS,msg,data);
}
protected ResultBean fail(String msg){
return convert(FAIL,msg,null);
}
protected ResultBean fail(String msg,Object data){
return convert(FAIL,msg,data);
}
/**
* 将数据封装成ResultBean
* @param code
* @param msg
* @param data
* @return
*/
ResultBean convert(int code,String msg,Object data){
return new ResultBean(code,msg,data);
}
}
定义一个控制类
@RestController
public class LoginController extends BaseController{
@PostMapping("/user/login")
public ResultBean login(@Valid @RequestBody LoginBean loginBean, BindingResult result){
// 通过BindingResult获取错误信息的集合
List<FieldError> fieldErrors = result.getFieldErrors();
// 判断长度大小
if (fieldErrors.size()>0){
// 顶一个Map集合封装字段和错误信息
Map map = new HashMap();
// 获取迭代器
Iterator<FieldError> iterator = fieldErrors.iterator();
while (iterator.hasNext()){
FieldError error = iterator.next();
map.put(error.getField(),error.getDefaultMessage());
}
return fail("登录失败",map);
}
return success("登录成功");
}
}
这是正常直接运行,一步一步之下下去。但是想了一下这样就会太麻烦,怎么可能要每一个都敲一遍。接下来就是我要使用的异常处理并会返回结果。
发生变化的有LoginController和BaseController,还需要定义一个异常类和一个全局增强的异常处理类
定义一个异常类ValidateException
/**
* 自定义异常类
*/
public class ValidateException extends Exception {
Map errorMap;
public ValidateException() {
super();
}
public ValidateException(Map errorMap){
super();
this.errorMap=errorMap;
}
public Map getErrorMap() {
return errorMap;
}
public void setErrorMap(Map errorMap) {
this.errorMap = errorMap;
}
}
全局增强的异常处理类GlobalExceptionHandler
/**
* 异常处理通知
*/
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler extends BaseController {
@ExceptionHandler(value = {ValidateException.class})
public ResultBean processValidException(ValidateException e){
return fail("登录失败",e.getErrorMap());
}
}
修改后的BaseController
public abstract class BaseController {
// 设置接口响应状态码
private final int SUCCESS=200;
private final int FAIL=0;
protected ResultBean success(String msg){
return convert(SUCCESS,msg,null);
}
protected ResultBean success(String msg,Object data){
return convert(SUCCESS,msg,data);
}
protected ResultBean fail(String msg){
return convert(FAIL,msg,null);
}
protected ResultBean fail(String msg,Object data){
return convert(FAIL,msg,data);
}
/**
* 将数据封装成ResultBean
* @param code
* @param msg
* @param data
* @return
*/
ResultBean convert(int code,String msg,Object data){
return new ResultBean(code,msg,data);
}
public void validate(BindingResult result) throws ValidateException {
List<FieldError> list = result.getFieldErrors();
// 判断错误信息的长度
if (list.size()>0){
Map map = new HashMap();
// 获得迭代器
Iterator<FieldError> iterator = list.iterator();
while (iterator.hasNext()){
FieldError next = iterator.next();
// 把错误字段、错误信息添加到map集合
map.put(next.getField(),next.getDefaultMessage());
}
throw new ValidateException(map);
}
}
}
修改后的LoginController
@RestController
public class LoginController extends BaseController{
@PostMapping("/user/login")
public ResultBean login(@Valid @RequestBody LoginBean loginBean, BindingResult result) throws ValidateException {
validate(result);
return success("登录成功");
}
}
在调用validate方法时,抛出了异常,然后全局异常处理类接收到了异常然后进行处理,调用了fail的方法直接进行了处理。这里在获取的错误消息的时候,如果调用validate时没有获取错误消息,会直接返回void然后进行返回success方法