我们后台使用`spring` 为我们提供好的统一校验的工具`spring-boot-starter-validation`对请求进行校验。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` 这里通过注解封装了几种常用的校验 - `@NotNull` 不能为null - `@NotEmpty` 不能为null、空字符串、空集合 - `@NotBlank` 不能为null、空字符串、纯空格的字符串 - `@Min` 数字最小值不能小于x - `@Max` 数字最大值不能大于x - `@Email` 字符串为邮件格式 - `@Max` 数字最大值不能大于x - `@Size` 字符串长度最小为x、集合长度最小为x - `@Pattern` 正则表达式 我们以`SysUser`为例,看看怎么使用 ```java public class SysUser implements Serializable { private static final long serialVersionUID = 1L; /** * 用户ID * */ @TableId private Long userId; /** * 用户名 */ @NotBlank(message="用户名不能为空") @Size(min = 2,max = 20,message = "用户名长度要在2-20之间") private String username; /** * 密码 */ @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String password; /** * 邮箱 */ @NotBlank(message="邮箱不能为空") @Email(message="邮箱格式不正确") private String email; /** * 手机号 */ @Pattern(regexp="0?1[0-9]{10}",message = "请输入正确的手机号") private String mobile; /** * 状态 0:禁用 1:正常 */ private Integer status; /** * 用户所在店铺id */ private Long shopId; /** * 角色ID列表 */ @TableField(exist=false) private List<Long> roleIdList; /** * 创建时间 */ private Date createTime; } ``` 我们在Controller层使用该bean,并使用`@Valid`注解,使校验的注解生效,如`SysUserController` : ```java @RestController @RequestMapping("/sys/user") public class SysUserController { /** * 保存用户 */ @SysLog("保存用户") @PostMapping @PreAuthorize("@pms.hasPermission('sys:user:save')") public ResponseEntity<String> save(@Valid @RequestBody SysUser user){ String username = user.getUsername(); SysUser dbUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>() .eq(SysUser::getUsername, username)); if (dbUser!=null) { return ResponseEntity.badRequest().body("该用户已存在"); } user.setShopId(SecurityUtils.getSysUser().getShopId()); user.setPassword(passwordEncoder.encode(user.getPassword())); sysUserService.saveUserAndUserRole(user); return ResponseEntity.ok().build(); } } ``` 并且在`DefaultExceptionHandlerConfig` 拦截由`@Valid` 触发的异常信息并返回: ```java @Controller @RestControllerAdvice public class DefaultExceptionHandlerConfig { @ExceptionHandler(BindException.class) public ResponseEntity<String> bindExceptionHandler(BindException e){ e.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){ e.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage()); } } ```