引入spring validation 校验依赖
org.springframework.boot spring-boot-starter-validation在实体类中加入@NotEmpty注解(也可以写其它注解),并向message中赋值你需要的信息
@Data
@ToString
/**
* 前端注册时发送的用户信息
*/
public class UmsMemberRegisterParamDTO {
//@Size(min=1,max = 8,message = "用户名长度在一到八之间")
@NotEmpty(message = "用户名不能为空")
private String username;
private String password;
private String icon;
private String email;
}
在controller层中定义好相对应的接口并在接收的参数加入@Valid
注解
@PostMapping("/register")
public ResultWrapper register(@RequestBody @Valid UmsMemberRegisterParamDTO umsMemberRegisterParamDTO){
umsMemberService.register(umsMemberRegisterParamDTO);
return ResultWrapper.getSuccessBuilder().date(null).build();
}
当用Postman工具访问对应的接口时,定义username
为空,可以看到前端出现400代码
后端没有报错,而是将数据展现在日志当中
此时日志中显示的是注解@NotEmpty中的message信息
所以我们需要重新定义一个类来处理其中的异常并给前端一个友好的返回值,故定义ValidateHandler
类来处理这些异常,其中ValidateHandler
需要继承ResponseEntityExceptionHandler
,并用一个StringBuilder
来储存message。
这里ResultWrapper
是定义的一个返回给前端的数据,并加了@builder注解实现
@ControllerAdvice
作用是处理全局异常
@ControllerAdvice
public class ValidateHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers,
HttpStatus status, WebRequest request) {
//sb用来存储实体类UmsMemberRegisterParamDTO 注解@NotEmpty中的message
//@NotEmpty(message = "用户名不能为空")
StringBuilder sb =new StringBuilder();
for(FieldError fieldError: ex.getBindingResult().getFieldErrors()){
String defaultMessage = fieldError.getDefaultMessage();
sb.append(" "+defaultMessage);
break;
}
return new ResponseEntity(ResultWrapper.builder().code(201).msg(sb.toString()).build(),HttpStatus.OK);
}
}
加入以上代码以后重新访问,处理成功