• 介绍

如今开发项目中数据的安全验证已经是必不可少的一部分,如果只是让前段做验证,并不能保证整个系统的安全。故在介绍一款非常好用的后端验证数据有效性的框架: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());
            }
        }
    }

安迪的信仰
75 声望10 粉丝

In the end, we will remember not the words of our enemies but the silence of our friends.


« 上一篇
kafka集群搭建