当前位置: 代码网 > it编程>编程语言>Java > SpringFramework中的数据校验方式

SpringFramework中的数据校验方式

2024年12月17日 Java 我要评论
数据校验(validation)通过validator接口引入相关依赖<dependency> <groupid>org.hibernate.validator</

数据校验(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数据校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com