正常情况
我们先演示一下正常情况下我们验证的方法。
首先定义一个LoginBean
@Data
public class LoginBean {
@NotBlank(message = "用户名不能为空")
String username;
@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 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){
List<FieldError> fieldErrors = result.getFieldErrors();
if (fieldErrors.size()>0){
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 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.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方法
Original: https://blog.csdn.net/nidimyger/article/details/128428777
Author: Mxhlin
Title: spring mvc 通过异常封装 验证 方法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/787563/
转载文章受原作者版权保护。转载请注明原作者出处!