依赖的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验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐