SpringBoot使用@Validated验证参数
一、前言
在前端传递参数给后台接口的时候,后端会对传递的参数做一个基础校验,以前是手动写if一个个验证,效率极其低,而且还做了很多重复工作。本例没有太对基础和原理讲解,直接上代码,就是要简单粗暴,大家先用起来再说。项目源代码请访问github获取。
二、使用步骤
Hibernate Validator在JSR 303校验框架中提供了很多注解类。此Hibernate与ORM框架无关,只是一个实现了JSR-303规范的验证框架。
@Validated可以看作是@Valid的加强注解,@Valid能只能作用在方法、属性、构造、参数上,而@Validated可以作用在类上。
2.1 在VO类上加上验证规则
在VO类属性上,我们可以加上我们需要的验证规则。
package com.agger.validatortest.vo;
import com.agger.validatortest.system.annotation.PhoneValidator;
import lombok.Data;
import lombok.ToString;
import javax.validation.constraints.*;
/**
* @classname: User
* @description: User类
* @author chenhx
* @date 2019-11-17 21:07
*/
@Data
@ToString
public class UserVO {
private Integer id;
@NotNull(message = "用户姓名不能为空")
@Size(min=1,max=20,message = "用户姓名超出范围限制{min}-{max}")
private String name;
@NotBlank(message = "手机号码不能为空")
@PhoneValidator //自定义验证注解
private String phone;
@NotNull
@Max(value = 100,message = "超出年龄限制{value}")
@Min(value = 1,message = "最小年龄为{value}")
private Integer age;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
}
2.2 Controller类
@Validated注解作用在控制类上,会将类中的所有方法都开启参数校验。只有作用在类上,GET方式的请求才会校验。单独作用在请求方法上,只有POST请求校验生效,GET请求校验不会生效。
package com.agger.validatortest.controller;
import com.agger.validatortest.system.annotation.PhoneValidator;
import com.agger.validatortest.vo.ResultVO;
import com.agger.validatortest.vo.UserVO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @classname: UserController
* @description: user控制器
* @author chenhx
* @date 2019-11-17 21:23
*/
@Validated //整个控制器都需要验证参数
@RestController
public class UserController {
//RESTful 风格请求
@GetMapping("/user/{phone}")
public ResultVO user(
@PathVariable
@NotBlank(message = "手机号码不能为空")
@PhoneValidator //使用自定义注解
String phone){
ResultVO result = new ResultVO();
result.setCode(0);
result.setMsg("通过手机号查询用户成功");
result.setData("用户phone为:" + phone);
return result;
}
@GetMapping("/getUser")
public ResultVO getUser