|
|
|
|
我们后台使用`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 ServerResponseEntity<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 ServerResponseEntity.showFailMsg("该用户已存在");
|
|
|
|
|
}
|
|
|
|
|
user.setShopId(SecurityUtils.getSysUser().getShopId());
|
|
|
|
|
user.setPassword(passwordEncoder.encode(user.getPassword()));
|
|
|
|
|
sysUserService.saveUserAndUserRole(user);
|
|
|
|
|
return ServerResponseEntity.success();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
并且在`DefaultExceptionHandlerConfig` 拦截由`@Valid` 触发的异常信息并返回:
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
@RestController
|
|
|
|
|
@RestControllerAdvice
|
|
|
|
|
public class DefaultExceptionHandlerConfig {
|
|
|
|
|
|
|
|
|
|
@ExceptionHandler(BindException.class)
|
|
|
|
|
public ServerResponseEntity<String> bindExceptionHandler(BindException e){
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage());
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
|
|
|
public ServerResponseEntity<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|