在開發(fā)中,我們經(jīng)常遇到參數(shù)校驗的需求,比如用戶注冊的時候,要校驗用戶名不能為空、用戶名長度不超過20個字符、手機號是合法的手機號格式等等。如果使用普通方式,我們會把校驗的代碼和真正的業(yè)務處理邏輯耦合在一起,而且如果未來要新增一種校驗邏輯也需要在修改多個地方。而spring validation允許通過注解的方式來定義對象校驗規(guī)則,把校驗和業(yè)務邏輯分離開,讓代碼編寫更加方便。Spring Validation其實就是對Hibernate Validator進一步的封裝,方便在Spring中使用。
在Spring中有多種校驗的方式
第一種是通過實現(xiàn)org.springframework.validation.Validator接口,然后在代碼中調(diào)用這個類
第二種是按照Bean Validation方式來進行校驗,即通過注解的方式。
第三種是基于方法實現(xiàn)校驗
除此之外,還可以實現(xiàn)自定義校驗
場景一:通過Validator接口實現(xiàn)
引入相關依賴
<dependencies>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
創(chuàng)建實體類,定義屬性和方法
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
創(chuàng)建類實現(xiàn)Validator接口,實現(xiàn)接口方法指定校驗規(guī)則
public class PersonValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Person.class.equals(clazz);
}
@Override
public void validate(Object object, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "name", "name.empty");
Person p = (Person) object;
if (p.getAge() < 0) {
errors.rejectValue("age", "error value < 0");
} else if (p.getAge() > 110) {
errors.rejectValue("age", "error value too old");
}
}
}
上面定義的類,其實就是實現(xiàn)接口中對應的方法,
supports方法用來表示此校驗用在哪個類型上,
validate是設置校驗邏輯的地點,其中ValidationUtils,是Spring封裝的校驗工具類,幫助快速實現(xiàn)校驗。
使用上述Validator進行測試
public static void main(String[] args) {
//創(chuàng)建person對象
Person person = new Person();
person.setName("lucy");
person.setAge(-1);
// 創(chuàng)建Person對應的DataBinder
DataBinder binder = new DataBinder(person);
// 設置校驗
binder.setValidator(new PersonValidator());
// 由于Person對象中的屬性為空,所以校驗不通過
binder.validate();
//輸出結(jié)果
BindingResult results = binder.getBindingResult();
System.out.println(results.getAllErrors());
}
場景二:Bean Validation注解實現(xiàn)
使用Bean Validation校驗方式,就是如何將Bean Validation需要使用的javax.validation.ValidatorFactory 和javax.validation.Validator注入到容器中。spring默認有一個實現(xiàn)類LocalValidatorFactoryBean,它實現(xiàn)了上面Bean Validation中的接口,并且也實現(xiàn)了org.springframework.validation.Validator接口。
創(chuàng)建配置類,配置LocalValidatorFactoryBean
@Configuration
@ComponentScan("com.cj.spring6.validator.three")
public class ValidationConfig {
@Bean
public MethodValidationPostProcessor validationPostProcessor() {
return new MethodValidationPostProcessor();
}
}
創(chuàng)建實體類,使用注解定義校驗規(guī)則
public class User {
@NotNull
private String name;
@Min(0)
@Max(120)
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
常用注解說明
@NotNull 限制必須不為null
@NotEmpty 只作用于字符串類型,字符串不為空,并且長度不為0
@NotBlank 只作用于字符串類型,字符串不為空,并且trim()后不為空串
@DecimalMax(value) 限制必須為一個不大于指定值的數(shù)字
@DecimalMin(value) 限制必須為一個不小于指定值的數(shù)字
@Max(value) 限制必須為一個不大于指定值的數(shù)字
@Min(value) 限制必須為一個不小于指定值的數(shù)字
@Pattern(value) 限制必須符合指定的正則表達式
@Size(max,min) 限制字符長度必須在min到max之間
@Email 驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
使用兩種不同的校驗器實現(xiàn)
使用jakarta.validation.Validator校驗
@Service
public class MyService1 {
@Autowired
private Validator validator;
public boolean validator(User user){
Set<ConstraintViolation<User>> sets = validator.validate(user);
return sets.isEmpty();
}
}
使用org.springframework.validation.Validator校驗文章來源:http://www.zghlxwxcb.cn/news/detail-457816.html
@Service
public class MyService2 {
@Autowired
private Validator validator;
public boolean validaPersonByValidator(User user) {
BindException bindException = new BindException(user, user.getName());
validator.validate(user, bindException);
return bindException.hasErrors();
}
}
最后進行測試
?文章來源地址http://www.zghlxwxcb.cn/news/detail-457816.html
@Test
public void testMyService1() {
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
MyService1 myService = context.getBean(MyService1.class);
User user = new User();
user.setAge(-1);
boolean validator = myService.validator(user);
System.out.println(validator);
}
@Test
public void testMyService2() {
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
MyService2 myService = context.getBean(MyService2.class);
User user = new User();
user.setName("lucy");
user.setAge(130);
user.setAge(-1);
boolean validator = myService.validaPersonByValidator(user);
System.out.println(validator);
}
場景三:基于方法實現(xiàn)校驗
創(chuàng)建配置類,配置MethodValidationPostProcessor
@Configuration
@ComponentScan("com.cj.spring6.validator.two")
public class ValidationConfig {
@Bean
public LocalValidatorFactoryBean validatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
}
創(chuàng)建實體類,使用注解設置校驗規(guī)則
import jakarta.validation.constraints.*;
public class User {
@NotNull
private String name;
@Min(0)
@Max(120)
private int age;
@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手機號碼格式錯誤")
@NotBlank(message = "手機號碼不能為空")
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
定義Service類,通過注解操作對象
@Service
@Validated
public class MyService {
public String testParams(@NotNull @Valid User user) {
return user.toString();
}
}
最后測試
@Test
public void testMyService1() {
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
MyService myService = context.getBean(MyService.class);
User user = new User();
user.setAge(-1);
myService.testParams(user);
}
到了這里,關于java使用Validation進行數(shù)據(jù)校驗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!