一.bean validation和hibernate validator參數(shù)校驗(yàn)常用約束注解:
空值校驗(yàn)類:@Null,@NotNull,@NotEmpty,@NotBlank等
范圍校驗(yàn)類:@Min,@Size,@Digits,@Future,@Negative等
其它校驗(yàn)類:@Email,@URL,@AssertTrue,@Pattern等
二.初級(jí)約束注解:
1. @NotNull(message = “用戶id不能為空”)
- 沒有設(shè)置值時(shí)會(huì)返回
- 設(shè)置為userInfo.setUserId("");時(shí)不會(huì)返回
- userInfo.setUserId(" ");時(shí)不會(huì)返回
2.@NotEmpty(message = “用戶名不能為空”)
- 不會(huì)自動(dòng)去掉字符串前后的空格再判斷是否為空
- 沒有設(shè)置值時(shí)會(huì)返回
- userInfo.setUserName("");時(shí)返回
- userInfo.setUserName(" ");時(shí)不返回
3.@NotBlank(message = “密碼不能為空”)
- 自動(dòng)去掉字符串前后的空格再判斷是否為空
- 沒有設(shè)置值時(shí)會(huì)返回
- userInfo.setPassWord("");時(shí)返回
- userInfo.setPassWord(" ");時(shí)返回
4.@Length(min = 6,max = 20,message = “密碼不能少于6位,也不能多于20位”)
- 可以直接不設(shè)置值
- 即數(shù)量必須在6到20之間(包含6和20)
5.@Email(message = “郵箱不正確”)
- 可以直接不設(shè)置值
- 必須是正確的郵箱格式
6. @Min(value = 18, message = “年齡不能小于18歲”)
- 可以直接不設(shè)置值
- 即年齡必須大于或者等于18歲
7. @Max(value = 60, message = “年齡不能大于60歲”)
- 可以直接不設(shè)置值
- 即年齡必須等于小于60歲
8.@Past(message = “生日只能是過去的時(shí)間或者現(xiàn)在的時(shí)間”)
- 可以直接不設(shè)置值
- 傳來的時(shí)間只能是過去的時(shí)間或者現(xiàn)在的時(shí)間,不能是未來時(shí)間
9.@Size(min = 1,message = “不能少于一個(gè)好友”)
- 可以直接不設(shè)置值
- 集合里面的內(nèi)容不能少于1
三.中級(jí)約束注解:
1.@Valid
- private List<@Valid UserInfo> friends;表示對(duì)UserInfo類中里面的每個(gè)屬性進(jìn)行驗(yàn)證
2.@NotNull(message = “注冊(cè)時(shí)郵箱不能為空”,groups = RegisterGroup.class)
-
//注冊(cè)場景 public interface RegisterGroup{}
//登錄場景 public interface LoginGroup{} - 注冊(cè)時(shí)郵箱不能為空,登錄時(shí)可以為空
- set = validator.validate(userInfo,UserInfo.RegisterGroup.class);
3.//組排序場景
@GroupSequence({
LoginGroup.class,
RegisterGroup.class,
Default.class
})
public interface Group{}
- set = validator.validate(userInfo,UserInfo.Group.class);
- 先驗(yàn)證 LoginGroup組的,都通過才驗(yàn)證下面的,不通過直接返回驗(yàn)證錯(cuò)誤信息,驗(yàn)證順序按照上面的順序進(jìn)行驗(yàn)證
四.高級(jí)約束注解:
1.public void setUserInfo(@Valid UserInfo userInfo){ }
set1 = executableValidator.validateParameters(service,method1,paramObject);
- @Valid對(duì)方法輸入?yún)?shù)進(jìn)行約束注解校驗(yàn)
2.public @Valid UserInfo getUserInfo(){return new UserInfo();}
set1 = executableValidator.validateReturnValue(userInfoService,method,returnValue);
- @Valid對(duì)方法返回值進(jìn)行約束校驗(yàn)
3.public UserInfoService(@Valid UserInfo userInfo){}
set1 = executableValidator.validateConstructorParameters(constructor,paramObject);
- @Valid對(duì)構(gòu)造函數(shù)輸入?yún)?shù)進(jìn)行校驗(yàn)
五.上面初,中,高級(jí)注解示例:
pom.xml
<!-- Validation 相關(guān)依賴 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
待驗(yàn)證對(duì)象實(shí)體類UserInfo.java:
package com.mystudy.elastic.job.springboot.validation;
import org.hibernate.validator.constraints.Length;
import javax.validation.GroupSequence;
import javax.validation.Valid;
import javax.validation.constraints.*;
import javax.validation.groups.Default;
import java.util.Date;
import java.util.List;
/**
* 待驗(yàn)證對(duì)象實(shí)體類
* 用戶信息類
*/
public class UserInfo {
//登錄場景
public interface LoginGroup{}
//注冊(cè)場景
public interface RegisterGroup{}
//組排序場景
@GroupSequence({
LoginGroup.class,
RegisterGroup.class,
Default.class
})
public interface Group{}
/**
* 用戶id
*/
@NotNull(message = "用戶id不能為空")
private String userId;
/**
* 用戶名
*/
@NotEmpty(message = "用戶名不能為空")
private String userName;
/**
* 密碼
*/
@NotBlank(message = "密碼不能為空")
@Length(min = 6, max = 20, message = "密碼不能少于6位,也不能多于20位")
private String passWord;
/**
* 郵箱
*/
// @NotNull(message = "注冊(cè)時(shí)郵箱不能為空",groups = RegisterGroup.class)
@Email(message = "郵箱不正確")
private String email;
/**
* 年齡
*/
@Min(value = 18, message = "年齡不能小于18歲")
@Max(value = 60, message = "年齡不能大于60歲")
private Integer age;
/**
* 手機(jī)號(hào)
*/
@Phone(message = "手機(jī)號(hào)不是158后面隨便的手機(jī)號(hào)")
private String phone;
/**
* 生日
*/
@Past(message = "生日只能是過去的時(shí)間或者現(xiàn)在的時(shí)間")
private Date birthday;
/**
* 好友列表
*/
@Size(min = 1,message = "不能少于一個(gè)好友")
private List<@Valid UserInfo> friends;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public List<UserInfo> getFriends() {
return friends;
}
public void setFriends(List<UserInfo> friends) {
this.friends = friends;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
用戶信息服務(wù)類UserInfoService.java:
package com.mystudy.elastic.job.springboot.validation;
import javax.validation.Valid;
/**
* 用戶信息服務(wù)類
*/
public class UserInfoService {
/**
* userInfo作為輸入?yún)?shù)
* @param userInfo
*/
public void setUserInfo(@Valid UserInfo userInfo){
}
/**
* userInfo作為輸出參數(shù)
* @return
*/
public @Valid UserInfo getUserInfo(){
return new UserInfo();
}
/**
* 默認(rèn)構(gòu)造函數(shù)
*/
public UserInfoService(){
}
/**
* 接收userInfo作為參數(shù)的構(gòu)造函數(shù)
* @param userInfo
*/
public UserInfoService(@Valid UserInfo userInfo){
}
}
驗(yàn)證測(cè)試類ValidationTest.java:
package com.mystudy.elastic.job.springboot.validation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.Set;
/**
* 驗(yàn)證測(cè)試類
*/
public class ValidationTest {
//驗(yàn)證器對(duì)象
private Validator validator;
//待驗(yàn)證對(duì)象
private UserInfo userInfo;
//驗(yàn)證結(jié)果集合
private Set<ConstraintViolation<UserInfo>> set;
//驗(yàn)證結(jié)果集合
private Set<ConstraintViolation<UserInfoService>> set1;
/**
* 初始化操作
*/
@Before
public void init() {
//初始化驗(yàn)證器
validator = Validation.buildDefaultValidatorFactory().getValidator();
//初始化待驗(yàn)證對(duì)象 用戶信息
userInfo = new UserInfo();
userInfo.setUserId(" ");
userInfo.setUserName(" ");
userInfo.setPassWord(" ");
userInfo.setPassWord("333333");
userInfo.setAge(18);
userInfo.setBirthday(new Date());
userInfo.setPhone("15987377373");
UserInfo friend = new UserInfo();
friend.setUserId("wangxiaoxi");
friend.setUserName("王小喜");
friend.setPassWord("wangxiaoxi");
userInfo.setFriends(new ArrayList() {{
add(friend);
}});
}
/**
* 結(jié)果打印
*/
@After
public void print() {
set.forEach(item -> {
//輸出驗(yàn)證錯(cuò)誤信息
System.out.println(item.getMessage());
});
// set1.forEach(item -> {
// //輸出驗(yàn)證錯(cuò)誤信息
// System.out.println(item.getMessage());
// });
}
@Test
public void nullValidation() {
//使用驗(yàn)證器對(duì)對(duì)象進(jìn)行驗(yàn)證
set = validator.validate(userInfo);
}
/**
* 級(jí)聯(lián)驗(yàn)證測(cè)試方法
*/
@Test
public void graphValidation() {
set = validator.validate(userInfo);
}
/**
* 驗(yàn)證注冊(cè)時(shí),郵箱是否為空
*/
@Test
public void groupValidation() {
set = validator.validate(userInfo, UserInfo.RegisterGroup.class);
}
/**
* 組排序
*/
@Test
public void groupSequenceValidate() {
set = validator.validate(userInfo, UserInfo.Group.class);
}
/**
* 對(duì)方法輸入?yún)?shù)進(jìn)行約束注解校驗(yàn)
*/
@Test
public void paramValidation() throws NoSuchMethodException {
//獲取校驗(yàn)執(zhí)行器
ExecutableValidator executableValidator = validator.forExecutables();
//待驗(yàn)證對(duì)象
UserInfoService service = new UserInfoService();
//待驗(yàn)證方法
Method method1 = service.getClass().getMethod("setUserInfo", UserInfo.class);
//方法的輸入?yún)?shù)
Object[] paramObject = new Object[]{new UserInfo()};
//對(duì)方法的輸入?yún)?shù)進(jìn)行校驗(yàn)
set1 = executableValidator.validateParameters(service, method1, paramObject);
}
/**
* 對(duì)方法返回值進(jìn)行約束校驗(yàn)
*/
@Test
public void returnValueValidation() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//獲取校驗(yàn)執(zhí)行器
ExecutableValidator executableValidator = validator.forExecutables();
//構(gòu)造要驗(yàn)證的方法對(duì)象
UserInfoService userInfoService = new UserInfoService();
Method method = userInfoService.getClass().getMethod("getUserInfo");
//調(diào)用方法得到返回值
Object returnValue = method.invoke(userInfoService);
//校驗(yàn)方法返回值是否符合約束
set1 = executableValidator.validateReturnValue(userInfoService, method, returnValue);
}
/**
* 對(duì)構(gòu)造函數(shù)輸入?yún)?shù)進(jìn)行校驗(yàn)
*/
@Test
public void constructorValidation() throws NoSuchMethodException {
//獲取驗(yàn)證執(zhí)行器
ExecutableValidator executableValidator = validator.forExecutables();
//獲取構(gòu)造函數(shù)
Constructor<UserInfoService> constructor = UserInfoService.class.getConstructor(UserInfo.class);
Object[] paramObject = new Object[]{new UserInfo()};
//校驗(yàn)構(gòu)造函數(shù)
set1 = executableValidator.validateConstructorParameters(constructor, paramObject);
}
}
六.自定義注解:
自定義手機(jī)號(hào)注解@interface Phone:
package com.mystudy.elastic.job.springboot.validation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 自定義手機(jī)號(hào)注解
*/
@Documented
//注解的作用目標(biāo)(可以設(shè)置作用在類,方法等等)
@Target({ElementType.FIELD})
//注解的保留策略(注解的生命周期)
@Retention(RetentionPolicy.RUNTIME)
//不同之處:與注解關(guān)聯(lián)的驗(yàn)證器
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
//注解驗(yàn)證不通過時(shí)輸出的信息
String message() default "手機(jī)號(hào)驗(yàn)證錯(cuò)誤";
//約束注解在驗(yàn)證時(shí)所屬的組別
Class<?>[] groups() default {};
//約束注解的有效負(fù)載
Class<? extends Payload>[] payload() default {};
}
自定義手機(jī)號(hào)注解關(guān)聯(lián)的驗(yàn)證器class PhoneValidator implements ConstraintValidator<Phone, String>:
package com.mystudy.elastic.job.springboot.validation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 自定義手機(jī)號(hào)注解關(guān)聯(lián)的驗(yàn)證器
*/
public class PhoneValidator implements ConstraintValidator<Phone, String> {
/**
* 自定義校驗(yàn)邏輯方法
*
* @param s
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//手機(jī)號(hào)驗(yàn)證規(guī)則:158后面隨便
String check = "158\\d{8}";
Pattern regex = Pattern.compile(check);
String phone = Optional.ofNullable(s).orElse("");
Matcher matcher = regex.matcher(phone);
//返回是否匹配
return matcher.matches();
}
}
待驗(yàn)證對(duì)象實(shí)體類UserInfo:
package com.mystudy.elastic.job.springboot.validation;
/**
* 待驗(yàn)證對(duì)象實(shí)體類
* 用戶信息類
*/
public class UserInfo {
/**
* 手機(jī)號(hào)
*/
@Phone(message = "手機(jī)號(hào)不是158后面隨便的手機(jī)號(hào)")
private String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
驗(yàn)證測(cè)試類ValidationTest文章來源:http://www.zghlxwxcb.cn/news/detail-814639.html
package com.mystudy.elastic.job.springboot.validation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
/**
* 驗(yàn)證測(cè)試類
*/
public class ValidationTest {
//驗(yàn)證器對(duì)象
private Validator validator;
//待驗(yàn)證對(duì)象
private UserInfo userInfo;
//驗(yàn)證結(jié)果集合
private Set<ConstraintViolation<UserInfo>> set;
/**
* 初始化操作
*/
@Before
public void init() {
//初始化驗(yàn)證器
validator = Validation.buildDefaultValidatorFactory().getValidator();
//初始化待驗(yàn)證對(duì)象 用戶信息
userInfo = new UserInfo();
userInfo.setPhone("15987377373");
}
/**
* 結(jié)果打印
*/
@After
public void print() {
set.forEach(item -> {
//輸出驗(yàn)證錯(cuò)誤信息
System.out.println(item.getMessage());
});
}
@Test
public void nullValidation() {
//使用驗(yàn)證器對(duì)對(duì)象進(jìn)行驗(yàn)證
set = validator.validate(userInfo);
}
}
結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-814639.html
到了這里,關(guān)于java的validation框架(參數(shù)校驗(yàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!