springboot项目中的dto的参数校验以及统一异常处理
依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.7.3</version>
</dependency>
dto类中的注解
根据下图可以看到有这么多的注解可以使用,就不一一列举了,挑两个常用的演示下
来一段dto中的代码
@Data
@ToString
public class UmsMemberRegisterDTO {
// 可以限制住该参数的位数
@Size(min = 6, max = 16, message = "用户名6位到16位")
private String username;
@Size(min = 8, max = 16, message = "密码位数为8~16")
private String password;
private String icon;
// 校验email格式
@Email
private String email;
// 不能为空
@NotEmpty
private String nickName;
}
controller中的修改
只需要将参数中添加@Valid注解
// 注册
@PostMapping("/register")
public ResultWrapper register(@RequestBody @Valid UmsMemberRegisterDTO umsMemberRegisterDTO){
return umsMemberService.insertUmsMember(umsMemberRegisterDTO);
}
其实现在已经起作用了,但是前端接收到的信息是报错信息如图:
说明第一个注解硬起作用了,返回400,bad request,那如何将这样的异常捕捉并且返回呢,继续往下看
创建validate异常处理器
创建一个处理器ValidateHandler 继承ResponseEntityExceptionHandler 重写handleMethodArgumentNotValid方法,如下:
@RestControllerAdvice
public class ValidateHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers,
HttpStatus status,
WebRequest request) {
StringBuilder stringBuilder = new StringBuilder();
for (FieldError fieldError: ex.getBindingResult().getFieldErrors()){
String defaultMessage = fieldError.getDefaultMessage();
// 将异常字段的信息提取
stringBuilder.append(" ").append(defaultMessage);
break;
}
// 这段注释是对返回值进行了统一处理,为了简化,这段代码注释了,直接将异常信息封装到ResponseEntity返回
// return new ResponseEntity(ResultWrapper.builder().code(301).msg(stringBuilder.toString()).build(),HttpStatus.OK);
return new ResponseEntity(stringBuilder.toString(),HttpStatus.OK);
现在的返回值就是一段字符串,如图:
当然也可以自己将结果封装下返回给前端,就是上面注释哪段代码,如图: