SpringBoot表单验证
1、引入依赖(springboot版本:2.5.4,不知道为什么里面没有@NotEmpty相关的依赖了,网上的说好像新版的Spring Boot不再自动集成hibernate-validation,需要手动添加依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、在实体类上创建对应的验证规则
@Data
@NoArgsConstructor
@TableName("sys_user")
@EqualsAndHashCode(callSuper = true)
public class Test extends Model<Test> {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "主键ID")
private Integer userId;
/**
* 账号
*/
@ApiModelProperty(value = "账号")
@NotEmpty(message = "账号不能为空")
private String userAccount;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
@NotEmpty(message = "姓名不能为空")
private String userName;
/**
* 密码
*/
@ApiModelProperty(value = "密码")
@NotEmpty(message = "密码不能为空")
private String userPassword;
}
常用规则说明,更多参考官方文档
注解 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@NotEmpty | 验证注解的元素值不为 null 且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在 min 到 max 之间(也可以用在集合上) |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 | |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
3、在controller接口的方法参数加入@Validated注解
@Slf4j
@RestController
@RequestMapping("/test")
@Api(value="测试",tags={"测试"})
public class TestController {
@PostMapping
@ApiOperation(value = "测试接口", notes = "测试接口")
public R tests(@Validated @RequestBody Test test) {
log.info("tests-->{}",test);
return R.success();
}
}
4、创建全局异常处理
/**
* @ClassName: ExceptionHandle
* @Description: 全局异常处理
* @Author: TanXJ
* @Date: 2021/10/12 17:49
*/
@Log4j2
@RestControllerAdvice
public class ExceptionHandle {
@ResponseStatus(value = HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public R exceptionHandler(MethodArgumentNotValidException exception) {
log.error(exception.getMessage(), exception);
return R.fail(401, exception.getBindingResult().getFieldError().getDefaultMessage());
}
}
返回值R是我自定义的返回类,可以更换为自己的返回类,下面这个是我使用的返回类
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一API对象返回
* @param <T>
* @Author: TanXJ
* @Date: 2021/10/13 9:31
*/
@Data
@NoArgsConstructor
public class R<T> {
/**
* 状态码
*/
private Integer code;
/**
* 返回消息
*/
private String message;
/**
* 状态
*/
private boolean status;
/**
* 返回数据
*/
private T data;
public R(Integer code, String message, boolean status, T data) {
this.code = code;
this.message = message;
this.status = status;
this.data = data;
}
public R(IResultCode resultCode, boolean status, T data) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
this.status = status;
this.data = data;
}
public R(IResultCode resultCode, boolean status) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
this.status = status;
this.data = null;
}
public static <T> R success() {
return new R<>(ResultCode.OK, true);
}
public static <T> R message(String message) {
return new R<>(ResultCode.OK.getCode(), message, true, null);
}
public static <T> R success(T data) {
return new R<>(ResultCode.OK, true, data);
}
public static <T> R fail() {
return new R<>(ResultCode.ERROR, false);
}
public static <T> R fail(IResultCode resultCode) {
return new R<>(resultCode, false);
}
public static <T> R fail(Integer code, String message) {
return new R<>(code, message, false, null);
}
public static <T> R fail(IResultCode resultCode, T data) {
return new R<>(resultCode, false, data);
}
public static <T> R fail(Integer code, String message, T data) {
return new R<>(code, message, false, data);
}
}
这样就可以啦,这是我的测试结果