接口参数校验规范
参数验证框架
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
常见的校验注解
@Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
被注释的元素必须是电子邮箱地址 | |
@Length(min=, max=) | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range(min=, max=) | 被注释的元素必须在合适的范围内 |
@NotBlank | 被注释的字符串的必须非空 |
@URL(protocol=,host=, port=, regexp=, flags=) | 被注释的字符串必须是一个有效的url |
@CreditCardNumber | 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性 |
@ScriptAssert lang=, script=, alias=) | 被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性 |
@SafeHtml(whitelistType=,additionalTags=) | classpath中要有jsoup包 |
主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:
@NotNull 任何对象的value不能为null @NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null @NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0
具体使用的例子
public class User {
@NotBlank
private String name;
//年龄要大于18岁
@Min(18)
private int age;
@Email
private String email;
//嵌套验证
@Valid
private Product products;
... //省略getter,setter
}
public class Product {
@NotBlank
private String name;
//价格在10元-50元之间
@Range(min=10,max=50)
private int price;
... //省略getter,setter
}
详情的注解 hibernate_validator_reference
springboot 参数类型
@QueryParam && @PathVariable
Step1 设置全局的拦截器,这个已经在common里面实现,更新common的maven版本
<dependency>
<groupId>com.eazytec.service</groupId>
<artifactId>common</artifactId>
<version>1.1.20</version>
</dependency>
Step2 controller加上注解 @Validated
@Validated
@SuppressWarnings("AlibabaMethodTooLong")
@RestController
@RequestMapping("/v3/gov/user")
public class ZqtGovUserController
Step3 在需要校验的参数上加上注解并加上提示性文字
@PathVariable("govUserId")
@NotBlank(message = "参数不能为空")
@Pattern(regexp = Validator.REGEX_UUID, message = "参数必须是uuid格式") String govUserId
@RequestBody
Step1 在@RequestBody标识的javabean里面标识下需要演示的属性
public class GovRole implements Serializable {
/**
* 编号
*
* @mbg.generated
*/
private String roleId;
/**
* 角色名称
*
* @mbg.generated
*/
@NotBlank(message = "角色名称不能为空")
private String name;
/**
* 父部门id,根部门为0
*
* @mbg.generated
*/
@NotBlank(message = "parentid不能为空")
private String parentid;
/**
* 企业id
*
* @mbg.generated
*/
@NotNull(message = "organizationId不能为null")
private Long organizationId;
}
Step2 在controller里面加入注解@Valid 和参数 BindingResult bindingResult来抛出异常
if (bindingResult.hasErrors()) {
return JSON.toJSONString(QixinchaResult.build(400, "参数异常",
bindingResult.getFieldError().getDefaultMessage()));
}
/**
* 创建角色
*
* @param role
* @return role
*/
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public String roleCreate(@Valid @RequestBody GovRole role, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return JSON.toJSONString(QixinchaResult.build(400, "参数异常",
bindingResult.getFieldError().getDefaultMessage()));
}
//生成bean
GovRole create = govRoleWebService.createRole(role);
//查重
if (govRoleWebService.checkDuplicate(role)) {
return JSON.toJSONString(QixinchaResult.build(600, "数据异常", "角色已存在"));
}
//入库
int res = govRoleService.insert(create);
return JSON.toJSONString(QixinchaResult.build(200, "success", res));
}