OVAL实现自定义基于注解的数据验证

  • 介绍

如今开发项目中数据的安全验证已经是必不可少的一部分,如果只是让前段做验证,并不能保证整个系统的安全。故在介绍一款非常好用的后端验证数据有效性的框架:oval
oval已经内置支持字段非空,数据长度,数据范围,正则匹配等验证,同时还可以在此框架的基础上实现自定义的验证。这次我就介绍一下常用的数据是否在数据库重复的验证。
依赖:

        <dependency>
            <groupId>net.sf.oval</groupId>
            <artifactId>oval</artifactId>
            <version>1.90</version>
        </dependency>
  • 简单使用

在此我定义一个User的实体类,其简单的验证代码如下:

public class User {
    @NotNull(message = "username can not be null",profiles = "username")
    @Length(min = 8,max = 20,message = "username length error.",profiles = "username")
    @MatchPattern(pattern = "(\\w+)",message = "username have special characters.",profiles = "username")
    private String username;
    private String password;
}

profiles 表示给该字段定义一个标签,为对象字段的选择性验证而存在。

  • 自定义验证注解

上面的列子只是oval自带的一些验证,当然这里也没有列举完全,如果有兴趣可以去查询其api.基本可以满足大部分项目需求。但如果需要定义一些特殊的验证规则这需要我们自己实现一部分代码。我这里举一个数据库的字段名是否重复的验证代码示例。


注解类:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Constraint(checkWith = UniqueCheck.class)
public @interface Unique {
    ConstraintTarget[] appliesTo() default {ConstraintTarget.VALUES};

    String errorCode() default "unique error";

    String message() default "field duplicate";

    String[] profiles() default {};

    int severity() default 0;

    String target() default "";

    String when() default "";

    String field();

    String tablename();

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
    @Constraints
    public @interface List {
        net.sf.oval.constraint.Length[] value();

        String when() default "";
    }

}

数据库验重:

public class UniqueCheck extends AbstractAnnotationCheck<Unique> {

    private String field;
    private String tablename;
    private String message;

    public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) throws OValException {

        if (validatedObject == null) return true;
        String value = valueToValidate.toString();
        /**
         * 在此处将表名,字段,值做数据库操作
         *
         * if exist ,return false
         */

        return true;
    }

    @Override
    protected Map<String, String> createMessageVariables() {
        Map<String, String> re = Validator.getCollectionFactory().createMap(2);
        re.put("message", this.message);
        return re;
    }

    @Override
    public void configure(Unique unique) {
        super.configure(unique);
        field = unique.field();
        tablename = unique.tablename();
        message = unique.message();
    }
}

至此,你只需要在username上面加上如下注解即可支持字段唯一性验证:

 @Unique(field="username",tablename="tb_user",profiles="username",message="数据库已存在")
  • 执行代码
public static void main(String[] args) {
        User user = new User("zhangsna");
        MyValidator.validator(person, "username");
    }

    static class MyValidator {
        public static <T> void validator(T t, String... profiles) {
            Validator v = new Validator();
            List<ConstraintViolation> message = v.validate(t, profiles);
            for (ConstraintViolation var : message) {
                System.out.println(var.getMessage());
            }
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值