Spring Boot ——使用javax.validation进行参数校验
原创
©著作权归作者所有:来自51CTO博客作者super彦的原创作品,请联系作者获取转载授权,否则将追究法律责任
基本用法
实体类
public class UserBean {
/**
* 1.@NotNull:不能为null,但可以为empty(""," "," ")
* 2.@NotEmpty:不能为null,而且长度必须大于0 (" "," ")
* 3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test") 即:必须有实际字符
* 复制代码
*/
@NotBlank(message="用户名不能为空")
private String userName;
@NotBlank(message="年龄不能为空")
@Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")
private String age;
@AssertFalse(message = "必须为false")
private Boolean isFalse;
/**
* 如果是空,则不校验,如果不为空,则校验
*/
@Pattern(regexp="^\\d{4}(-)(1[0-2]|0?\\d)\\1([0-2]\\d|\\d|30|31)$",message="出生日期格式不正确")
private String birthday;
@Pattern(regexp = "^[M|F|U|m|f|u]{1}$")
private String gender;
@Pattern(regexp = "^(MS)?(MR)?(PRO)?(MRS)?(DOC)?$")
private String civility;
@Size(min = 1, message = "field names can't be empty")
private List<String> names = new ArrayList();
}
测试;
@RestController
@RequestMapping("/vh")
public class ValidatorController {
@RequestMapping("/resign")
public String resign(@RequestBody @Valid UserBean user ) {
return "success";
}
}
如果校验通不过返回这样的报文:
这种方式返回的报文不能控制,我们来看第二种方案:
方式二
工具类;
/**
* hibernate-validator校验工具类
*/
public class ValidatorUtils {
private static Validator validator;
static {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
/**
* 校验对象
*
* @param object
* 待校验对象
* @param groups
* 待校验的组
* @throws CustomException
* 校验不通过,则报RRException异常
*/
public static void validateEntity(Object object, Class<?>... groups) throws CustomException {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
if (!constraintViolations.isEmpty()) {
ConstraintViolation<Object> constraint = (ConstraintViolation<Object>) constraintViolations.iterator()
.next();
throw new CustomException(new ParamResultCode(constraint.getMessage()));
}
}
public static boolean isNotNull(Object obj) {
try {
if (obj == null || obj.toString().equals("null") || obj.toString().equals("")) {
return false;
}
return true;
} catch (Exception e) {
return true;
}
}
}
分组;
/**
* 新增数据 Group
*/
public interface SaveGroup {
}
这个分组的意思时当添加数据时这个校验生效
测试:
@RestController
@RequestMapping("/vh")
public class ValidatorController {
@RequestMapping("/resign")
public String resign(@RequestBody @Valid UserBean user ) {
ValidatorUtils.validateEntity(user , SaveGroup.class);
return "success";
}
}
返回结果:
{
"msg": "用户名不能为空",
"code": 500
}
推荐使用第二种方式
附录:
@Validated与@Valid 的区别
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。
注解说明:
Bean验证约束
注解
| 支持的数据类型
| 作用
|
@AssertFalse
| Boolean, boolean
| 值等于false
|
@AssertTrue
| Boolean, boolean
| 值等于true
|
@Future
| java.util.Date 等
| 检查给定的日期比当前日期晚.
|
@Past
| java.util.Date 等
| 检查给定的日期比当前日期早.
|
@Max
| BigDecimal, BigInteger, byte, short, int, long 以及包装类
| 检查该值是否小于或等于约束条件中指定的最大值.
|
@Min
| BigDecimal, BigInteger, byte, short, int, long 以及包装类
| 检查该值是否大于或等于约束条件中指定的最小值.
|
@NotNull
| 任意类型
| 带注释的值不为null.
|
@Null
| 任意类型
| 带注释的值为null.
|
@Pattern(regex=, flag=)
| String
| 检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配.
|
@Size(min=, max=)
| String,Collection,Map,array
| 检查带注释的元素的大小是否在最小值和最大值之间.
|
@Valid
| 任何引用数据类型
| |
@CreditCardNumbe
| String
| 检查信用卡号
|
@Email
| String
| 检查指定的字符串是否为有效的电子邮件地址。
|
@Length(min=, max=)
| String
| 确认带注释的字符串在min和max之间.
|
@NotBlank
| String
| 值不为null 切不为"", 不为" "
|
@NotEmpty
| String,Collection,Map,array
| 值不为null 或者没有值
|
@Range(min=, max=)
| BigDecimal,String, BigInteger, byte, short, int, long 以及包装类
| 值是否位于(包含)指定的最小值和最大值之间。
|
@SafeHtml(whitelistType=, additionalTags=)
| | 检查带注释的值是否包含潜在的恶意片段,如脚本/。为了使用这个约束,jsoup库必须是类路径的一部分。可以选择whitelistType属性预定义白名单类型。您还可以使用additionalTags属性为白名单指定额外的html标记。
|
@URL(protocol=, host=, port=, regexp=, flags=)
| String
| 根据RFC2396,检查带注释的字符串是否是有效的URL。如果指定了任何可选参数协议、主机或端口,相应的URL片段必须匹配指定的值。可选参数regexp和旗帜允许指定URL必须匹配的额外正则表达式(包括正则表达式标志)。
|