参数校验

46 阅读1分钟

引入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);
    }
}

加入以上代码以后重新访问,处理成功