开始
导入依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
|
DTO
实用javax.validation.constraints.Pattern
注解可以直接用正则表达式进行验证。
1 2 3 4 5 6 7 8 9 10 11 12 13
| import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.Pattern;
@NoArgsConstructor @AllArgsConstructor @Data public class UserDto { protected String username; @Pattern(regexp = "^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[\\W_]).{6,24}$", message = "密码格式不正确") protected String password; }
|
控制类
光配置参数接收类还不行,此时验证并没有生效,还需要在控制层的方法中加上为DTO参数加上javax.validation.Valid
注解才能生效,案例代码如下:
1 2 3 4 5 6 7
| @PostMapping public Result login(@Valid @RequestBody UserDto userDto) { String token = userService.login(userDto.getUsername(), userDto.getPassword()); return StringUtils.isNotBlank(token) ? Result.buildSuccess("登录成功!",token) : Result.buildFail("登录失败,用户名不存在或密码错误"); }
|
异常捕获
当数据验证失败,会抛出org.springframework.web.bind.MethodArgumentNotValidException
异常。
如需要全局捕获异常可以使用AOP实现,拦截代理示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @ExceptionHandler(MethodArgumentNotValidException.class) public Result sqlException(MethodArgumentNotValidException ex, HttpServletRequest request, HttpServletResponse response) { setHeader(request, response);
return Result.buildFail("数据校验失败:" + ex.getBindingResult() .getAllErrors() .stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining(";"))); }
private void setHeader(HttpServletRequest request, HttpServletResponse response) { response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin")); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT,PATCH, DELETE, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "*"); }
|
以上处理代码可以在数据校验失败时将自定义的失败原因发送给前端
Result为自定义返回格式类
全局异常处理可以参考Spring Boot 使用@RestControllerAdvice实现捕获全局异常统一处理
参考文档
Spring Boot 使用@RestControllerAdvice实现捕获全局异常统一处理
spring-boot-starter-validation进行参数校验