java使用Validation進行數(shù)據(jù)校驗的方式總結
前言
在開發(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(); //輸出結果 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校驗
@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(); } }
最后進行測試
@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ù)校驗的文章就介紹到這了,更多相關java用Validation數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA實現(xiàn)Maven項目創(chuàng)建并連接Tomcat方式
Maven是一款由Apache開發(fā)的項目管理工具,主要用于Java項目的構建和依賴管理,它通過pom.xml文件自動管理項目依賴的jar包,簡化了項目構建過程,Maven支持項目從編寫源代碼到編譯、測試、打包、部署的全過程管理,其依賴管理功能免去了手動添加jar包的麻煩2024-10-10關于SpringGateway調(diào)用服務 接受不到參數(shù)問題
這篇文章主要介紹了關于SpringGateway調(diào)用服務接受不到參數(shù)問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法
這篇文章主要介紹了Java編程實現(xiàn)中英混合字符串數(shù)組按首字母排序的方法,涉及Java字符串操作及拼音轉換的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解
這篇文章主要為大家介紹了Seata?AT獲取數(shù)據(jù)表元數(shù)據(jù)源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11