SpringFramework中的數(shù)據(jù)校驗(yàn)方式
數(shù)據(jù)校驗(yàn)(Validation)
通過(guò)Validator接口
引入相關(guān)依賴(lài)
<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>實(shí)體類(lèi)
@Data
public class Person{
private String name;
private String age;
}數(shù)據(jù)校驗(yàn)器類(lèi)
public class PersonValidator implements Validator{
//指定需要校驗(yàn)的類(lèi)型
@Override
public boolean supports(Class<?> clazz) {
return Person.class.equals(clazz);
}
//校驗(yàn)規(guī)則
@Override
public void validate(Object target, Errors errors) {
//name不能為空
ValidationUtils.rejectIfEmpty(errors,"name",errorCode:"name.empty","name is null")
//<0age<100
Person p = (Person)target;
if(p.getAge()<0){
//參數(shù)依次為,需要校驗(yàn)的屬性,錯(cuò)誤碼,提示信息
errors.rejectValue("age","age.value.error","age<0")
}else if(p.getAge()>100){
errors.rejectValue("age","age.value.error.old","age>100")
}
}
}測(cè)試類(lèi)
@Test
public void test(){
//創(chuàng)建person對(duì)象
Person person = new Person();
person.setName("li");
person.setAge(-1);
//創(chuàng)建person對(duì)應(yīng)databinder
DataBinder binder = new DataBinder(person);
//設(shè)置校驗(yàn)器
binder.setValidator(new PersonValidator());
//調(diào)用方法執(zhí)行校驗(yàn)
binder.validate();
//輸出校驗(yàn)結(jié)果
BindingResult result = binder.getBindingResult();
System.out.println(result.getAllErrors());
}通過(guò)Validation注解
配置類(lèi),配置LocalValidatorFactoryBean
@Configuration
@ComponentScan("com.atli")
public class ValidationConfig{
@Bean
public LocalValidatorFactoryBean validator(){
return new LocalValidatorFactoryBean();
}
}實(shí)體類(lèi)
/**
* 常用注解
* @NotNull:不為空
* @NotEmpty:用于字符串,字符串不為空,長(zhǎng)度不為0
* @NotBlank:用于字符串,字符串不為空,trim()后不為空串
* @DecimalMax(value):不大于指定值的數(shù)字
* @DecimalMin(value):不小于指定值的數(shù)字
* @Max(value):不大于指定值數(shù)字
* @Min(value):不小于指定值數(shù)字
* @Pattern(value):符合指定正則表達(dá)式
* @Size(max,min):字符長(zhǎng)度在min到max之間
* @Email:為email格式
*/
@Component
@Data
public class User{
@NotNull
private String name;
@Min(0)
@Max(100)
private int age;
public User(String name, int age){
this.name=name;
this.age=age;
}
}校驗(yàn)器
//原生的校驗(yàn)器寫(xiě)法
@Service
public class JavaValidation{
@Autowired
private Validator validator;
public boolean validatorByUser(User user){
Set<ConstraintViolation<User>> validate=validator.validate(user);
return validate.isEmpty();
}
}
//spring的校驗(yàn)器寫(xiě)法
@Service
public class SpringValidation{
@Autowired
private Validator validator;
public boolean validatorByUser(User user){
BindException bindException = new BindException(user,user.getName());
validator.validate(user,bindException);
return bindException.hasErrors();
}
}測(cè)試類(lèi)
//測(cè)試原生校驗(yàn)器
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
JavaValidation javaValidation = context.getBean(JavaValidation.class);
User user = new User("li",-1);
boolean message = javaValidation.validatorByUser(user);
System.out.println(message);
}
//測(cè)試spring校驗(yàn)器
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
SpringValidation springValidation = context.getBean(SpringValidation.class);
User user = new User("li",-1);
boolean message = springValidation.validatorByUser(user);
System.out.println(message);
}基于方法實(shí)現(xiàn)校驗(yàn)
配置類(lèi)
@Configuration
@ComponentScan("com.atli")
public class ValidationConfig{
@Bean
public MethodValidationPostProcessor validationPostProcessor(){
return new MethodValidationPostProcessor();
}
}實(shí)體類(lèi)
@Data
public class User{
@NotNull
private String name;
@Min(0)
@Max(100)
private int age;
public User(String name, int age){
this.name=name;
this.age=age;
}
}校驗(yàn)器
@Service
@Validated
public class UserService{
public String testMethod(@NotNull @Valid User user){
return user.toString();
}
}測(cè)試類(lèi)
@Test
public void testJavaValidation(){
ApplicationContext context = new AnnotationConfigApplicationContext(ValidationConfig.class);
UserService service = context.getBean(UserServicen.class);
User user = new User("li",-1);
service.testMethod(user);
}自定義校驗(yàn)
自定義校驗(yàn)其實(shí)是通過(guò)自定義注解的方式來(lái)擴(kuò)展已有的校驗(yàn)功能以下用校驗(yàn)沒(méi)有空格為例
自定義注解(可以直接在已有注解中改)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy={CannotBlankValidation.class})
public @interface CannotBlank{
//默認(rèn)錯(cuò)誤提示信息
String message() default "cannot blank"
Class<?>[] groups() default{};
Class<? extends Payload>[] payload() default{};
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List{
NotNull[] value();
}
}注解解析器
public class CannotBlankValidation implements ConstraintValidator<CannotBlank,String>{
@Override
public boolean isValid(String value, ConstraintValidatorContext context){
if(value != null && value.contains(" ")){
return false;
}
}
}到此這篇關(guān)于SpringFramework中的數(shù)據(jù)校驗(yàn)方式的文章就介紹到這了,更多相關(guān)SpringFramework數(shù)據(jù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 如何解決Could not transfer artifact org.springframework.boot問(wèn)題
- SpringBoot引入Redis報(bào)org.springframework.data.redis.core.RedisTemplate類(lèi)找不到錯(cuò)誤問(wèn)題
- 程序包org.springframework.boot不存在的問(wèn)題解決
- java:無(wú)法訪(fǎng)問(wèn)org.springframework.boot.SpringApplication問(wèn)題
- 程序包org.springframework不存在的解決辦法
- org.springframework.web.client.ResourceAccessException資源訪(fǎng)問(wèn)錯(cuò)誤的解決方法
- Java報(bào)錯(cuò):Error:java:?程序包org.springframework.boot不存在解決辦法
相關(guān)文章
macOS完全卸載Java開(kāi)發(fā)環(huán)境詳細(xì)教程
Java開(kāi)發(fā)環(huán)境的搭建是每一位Java程序員職業(yè)生涯的起點(diǎn),其核心在于JDK(Java Development Kit)的正確安裝與系統(tǒng)級(jí)環(huán)境變量的精準(zhǔn)配置,這篇文章主要介紹了macOS完全卸載Java開(kāi)發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下2026-01-01
圖解Java經(jīng)典算法冒泡排序的原理與實(shí)現(xiàn)
冒泡排序是一種簡(jiǎn)單的排序算法,它也是一種穩(wěn)定排序算法。其實(shí)現(xiàn)原理是重復(fù)掃描待排序序列,并比較每一對(duì)相鄰的元素,當(dāng)該對(duì)元素順序不正確時(shí)進(jìn)行交換。一直重復(fù)這個(gè)過(guò)程,直到?jīng)]有任何兩個(gè)相鄰元素可以交換,就表明完成了排序2022-09-09
spring boot 添加admin監(jiān)控的方法
這篇文章主要介紹了spring boot 添加admin監(jiān)控的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Java實(shí)戰(zhàn)個(gè)人博客系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實(shí)現(xiàn)一個(gè)個(gè)人博客系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2022-01-01
聊一聊new對(duì)象與Spring對(duì)bean的初始化的差別
這篇文章主要介紹了聊一聊new對(duì)象與Spring對(duì)bean的初始化的差別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
springboot集成nacos讀取nacos配置數(shù)據(jù)的原理
這篇文章主要介紹了springboot集成nacos讀取nacos配置數(shù)據(jù)的原理,文中有詳細(xì)的代碼流程,對(duì)大家學(xué)習(xí)springboot集成nacos有一定的幫助,需要的朋友可以參考下2023-05-05
Java利用完全二叉樹(shù)創(chuàng)建大根堆和小根堆
大根堆是每個(gè)結(jié)點(diǎn)的值不大于他的父親結(jié)點(diǎn)的值;小根堆是每個(gè)結(jié)點(diǎn)的值不小于他的父親結(jié)點(diǎn)的值。本文將利用完全二叉樹(shù)創(chuàng)建大根堆和小根堆,感興趣的可以了解一下2022-08-08

