开始

导入依赖

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进行参数校验