@Valid注解的使用
依赖的jar包导入<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency><dependency
·
依赖的jar包导入
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<!--如果是spring boot项目,可直接只用下列依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.5</version>
</dependency>
@Valid注解用于校验,所属的包: javax.validation.Valid。而在Springboot启动器的web包已经含有该包,所以无需添加多余的依赖
你可以定义实体,在实体的属性上添加校验规则,在API接收数据时添加@Valid注解,这时你的实体将会开启一个校验的功能。
示例:
(1).首先需要在实体类的相应字段上添加用于充当校验条件的注解
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
*
* @author Administrator
* @Valid注解用于校验
* @NotNull 限制必须不为null
* @Size(max,min) 限制字符长度必须在min到max之间
* @Max(value) 限制必须为一个不大于指定值的数字
*/
public class AddCategoryReq {
@Size(min=2, max=5)
@NotNull(message = "name不能为null")
private String name;
@NotNull(message = "type不能为null")
@Max(3)
private Integer type;
@NotNull(message = "parentId不能为null")
private Integer parentId;
@NotNull(message = "orderNum不能为null")
private Integer orderNum;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
(2).其次在controller层的方法的要校验的参数上添加@Valid注解
@RestController
public class CategoryController {
@PostMapping("/admin/category/add")
public Map<String,Object> addCategory(
@Valid @RequestBody AddCategoryReq addCategoryReq) {
map.put("code", 200);
map.put("message", "success");
return map;
}
}
(3).编写全局异常捕捉
/**
* 处理统一异常的handler
* @author Administrator
* @ControllerAdvice拦截控制器的异常
*/
@ControllerAdvice
public class GlobalExceptionHandler {
//打印错误的日志
private final Logger log = LoggerFactory.getLogger(
GlobalExceptionHandler.class);
//拦截校检错误异常
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Object handleMethodArgumentNotValidException(
MethodArgumentNotValidException e) {
log.error("MethodArgumentNotValidException", e);
return handleBindingResult(e.getBindingResult());
}
private Map<String,Object> handleBindingResult(BindingResult result) {
//把异常处理为对外暴露的提示
List<String> list = new ArrayList<>();
//hasErrors()返回异常是否包含错误信息
if (result.hasErrors()) {
//获取异常错误信息,并添加到list集合中
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError objectError : allErrors) {
list.add(objectError.getDefaultMessage());
}
}
//返回校检错误的信息
map.put("code", 10002);
map.put("message", list.toString());
return map;
}
}
(4).最后向接口传入JSON参数
{"name":"火腿2542241542452","type":"4","parentId":"116","orderNum":""}
打印结果
{
"code": 10013,
"msg": "[orderNum不能为null, name个数必须在2和5之间, type最大不能超过3]",
"data": {}
}
注意:在表单验证的时候,要注意Validation的相关注解要和表单类的字段相对应,还是会抛出500的异常(因为这个异常不是MethodArgumentNotValidException异常,里面的信息对用户也没有实际的作用)
实体类更多的校检用法如下:
限制 | 说明 |
---|---|
@Null | 用在基本类型上;限制只能为null |
@NotNull | 用在基本类型上;不能为null,但可以为empty |
@NotEmpty | 用在集合类上面;不能为null,而且长度必须大于0 |
@NotBlank | 用在String上面;只能作用在String上,不能为null,而且调用trim()后,长度必须大于0 |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@Digits | 验证 Number 和 String 的构成是否合法 |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字,小数存在精度 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字,小数存在精度 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Future | 限制必须是一个将来的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email |
更多推荐
已为社区贡献1条内容
所有评论(0)