验证参数注解校验总结
【参数校验注解的使用规则方法】:
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 @Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum. @Range(min=10000,max=50000,message=“range.bean.wage”) private BigDecimal wage;
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
【注解@ScriptAssert】:
注解@ScriptAssert是处理实体类复杂业务逻辑的,具体参考文章:Spring boot使用总结(三)校验
(1)举例实体类请求参数:
package com.caox.model;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.ScriptAssert;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import com.caox.model.UserInfo.CHECK;
import java.io.Serializable;
/**
* @author : nazi
* @version : 1.0
* @date : 2019/6/5 14:27
*/
@Data
@Setter
@Getter
@ScriptAssert(lang="javascript",script="com.caox.model.UserInfo.checkParams(_this.username,_this.age,_this.classes)",
groups=CHECK.class)
public class UserInfo implements Serializable {
private static final long serialVersionUID = 8660354316408237192L;
@NotBlank(groups=NAME.class)
private String username;
// private Date birthDate;
@Min(value=3,groups=AGE.class)
private Integer age;
private String classes;
public interface CHECK{};
private Integer userId;
public interface NAME{};
public interface AGE{};
//注意进行校验的方法要写成静态方法,否则会出现
//TypeError: xxx is not a function 的错误
public static boolean checkParams(String username, int age, String classes) {
if (username != null && age > 8 && classes != null) {
return true;
} else {
return false;
}
}
//
// public UserInfo(Integer userId, String username, Date birthDate, Integer age, float fRate, char ch) {
// this.userId = userId;
// this.username = username;
// this.birthDate = birthDate;
// this.age = age;
// this.fRate = fRate;
// this.ch = ch;
// }
//
// public UserInfo(Integer userId, String username) {
// this.userId = userId;
// this.username = username;
// }
//
// public UserInfo(Integer userId, String username, Integer age) {
// this.userId = userId;
// this.username = username;
// this.age = age;
// }
@Override
public String toString() {
return "UserInfo{" +
"userId=" + userId +
", username='" + username + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserInfo userInfo = (UserInfo) o;
if (!userId.equals(userInfo.userId)) return false;
return username.equals(userInfo.username);
}
@Override
public int hashCode() {
int result = userId.hashCode();
result = 31 * result + username.hashCode();
return result;
}
}
(2)后台校验Controller
package com.caox.controller;
/**
* @author : nazi
* @version : 1.0
* @date : 2019/9/4 13:48
*/
import com.caox.model.UserInfo;
import com.caox.model.UserInfo.CHECK;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class ValidateController {
@PostMapping(value="test")
public void testStudent3(@RequestBody @Validated(CHECK.class) UserInfo userInfo,BindingResult result) {
System.out.println("resolve this check success" + userInfo.getUserId());
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("\n");
if (result.hasErrors()) {
List list = result.getAllErrors();
for (ObjectError error : list) {
System.out.println(error.getCode() + "---" + error.getArguments() + "---" + error.getDefaultMessage());
System.out.println(error.toString());
sBuilder.append(error.getDefaultMessage());
sBuilder.append("\n");
}
}
System.out.println(sBuilder.toString());
}
}
(3)如果校验参数不满足 checkParams() 函数的处理逻辑,则会返回如下异常 BindingResult:
可以将 BindingResult 返回给前端处理校验错误提示