SpringFramework中的数据校验方式
作者:__admin__
这篇文章主要介绍了SpringFramework中的数据校验方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
数据校验(Validation)
通过Validator接口
引入相关依赖
<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>
实体类
@Data public class Person{ private String name; private String age; }
数据校验器类
public class PersonValidator implements Validator{ //指定需要校验的类型 @Override public boolean supports(Class<?> clazz) { return Person.class.equals(clazz); } //校验规则 @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){ //参数依次为,需要校验的属性,错误码,提示信息 errors.rejectValue("age","age.value.error","age<0") }else if(p.getAge()>100){ errors.rejectValue("age","age.value.error.old","age>100") } } }
测试类
@Test public void test(){ //创建person对象 Person person = new Person(); person.setName("li"); person.setAge(-1); //创建person对应databinder DataBinder binder = new DataBinder(person); //设置校验器 binder.setValidator(new PersonValidator()); //调用方法执行校验 binder.validate(); //输出校验结果 BindingResult result = binder.getBindingResult(); System.out.println(result.getAllErrors()); }
通过Validation注解
配置类,配置LocalValidatorFactoryBean
@Configuration @ComponentScan("com.atli") public class ValidationConfig{ @Bean public LocalValidatorFactoryBean validator(){ return new LocalValidatorFactoryBean(); } }
实体类
/** * 常用注解 * @NotNull:不为空 * @NotEmpty:用于字符串,字符串不为空,长度不为0 * @NotBlank:用于字符串,字符串不为空,trim()后不为空串 * @DecimalMax(value):不大于指定值的数字 * @DecimalMin(value):不小于指定值的数字 * @Max(value):不大于指定值数字 * @Min(value):不小于指定值数字 * @Pattern(value):符合指定正则表达式 * @Size(max,min):字符长度在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; } }
校验器
//原生的校验器写法 @Service public class JavaValidation{ @Autowired private Validator validator; public boolean validatorByUser(User user){ Set<ConstraintViolation<User>> validate=validator.validate(user); return validate.isEmpty(); } } //spring的校验器写法 @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(); } }
测试类
//测试原生校验器 @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); } //测试spring校验器 @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); }
基于方法实现校验
配置类
@Configuration @ComponentScan("com.atli") public class ValidationConfig{ @Bean public MethodValidationPostProcessor validationPostProcessor(){ return new MethodValidationPostProcessor(); } }
实体类
@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; } }
校验器
@Service @Validated public class UserService{ public String testMethod(@NotNull @Valid User user){ return user.toString(); } }
测试类
@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); }
自定义校验
自定义校验其实是通过自定义注解的方式来扩展已有的校验功能以下用校验没有空格为例
自定义注解(可以直接在已有注解中改)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy={CannotBlankValidation.class}) public @interface CannotBlank{ //默认错误提示信息 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; } } }
到此这篇关于SpringFramework中的数据校验方式的文章就介绍到这了,更多相关SpringFramework数据校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- 如何解决Could not transfer artifact org.springframework.boot问题
- SpringBoot引入Redis报org.springframework.data.redis.core.RedisTemplate类找不到错误问题
- 程序包org.springframework.boot不存在的问题解决
- java:无法访问org.springframework.boot.SpringApplication问题
- 程序包org.springframework不存在的解决办法
- org.springframework.web.client.ResourceAccessException资源访问错误的解决方法
- Java报错:Error:java: 程序包org.springframework.boot不存在解决办法