摘要:故在介绍一款非常好用的后端验证数据有效性的框架已经内置支持字段非空,数据长度,数据范围,正则匹配等验证,同时还可以在此框架的基础上实现自定义的验证。
介绍
如今开发项目中数据的安全验证已经是必不可少的一部分,如果只是让前段做验证,并不能保证整个系统的安全。故在介绍一款非常好用的后端验证数据有效性的框架:oval
oval已经内置支持字段非空,数据长度,数据范围,正则匹配等验证,同时还可以在此框架的基础上实现自定义的验证。这次我就介绍一下常用的数据是否在数据库重复的验证。
依赖:
net.sf.oval oval 1.90
简单使用
在此我定义一个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{ 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 createMessageVariables() { Map 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 staticvoid validator(T t, String... profiles) { Validator v = new Validator(); List message = v.validate(t, profiles); for (ConstraintViolation var : message) { System.out.println(var.getMessage()); } } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68552.html
摘要:先看效果原谅我的渣像素,进度的刻度宽度颜色可以随意设定项目地址实现起来并不难,通过本文,我们可以学到自定义属性的使用。 showImg(/img/remote/1460000006806723); 先看效果(原谅我的渣像素),进度的刻度、宽度、颜色可以随意设定: showImg(/img/remote/1460000006806724); showImg(/img/remote/146...
摘要:的自身注解的用法。所以自定义注解的作用很广。但是在这里,我仅仅基于的来实现适用于它的自定义注解。其他的自定义的注解的编写思路和这个也是类似的。 基于shiro的自定义注解的扩展 根据我的上一篇文章,权限设计的杂谈中,涉及到了有关于前后端分离中,页面和api接口断开表与表层面的关联,另辟蹊径从其他角度找到方式进行关联。这里我们主要采取了shiro的自定义注解的方案。本篇文章主要解决以下的...
摘要:阅读原文造个轮子我学到了什么听说的最多的是不是不要重复的造轮子不要被这句话蒙骗了,这句话应该还没说完整,在什么情况下不要造轮子实际项目中由于工期和质量原因,肯定不希望你造轮子,你造轮子花费时间且质量不如现有的轮子。 阅读原文:造个轮子,我学到了什么 听说的最多的是不是不要重复的造轮子?不要被这句话蒙骗了,这句话应该还没说完整,在什么情况下不要造轮子?实际项目中由于工期和质量原因,肯定不...
摘要:例子参考自官方文档,官方文档的配置有点过期了,一两个属性不合法。类,测试类,配置,输出结果, 例子参考自官方文档,http://oval.sourceforge.net/u...官方文档的xml配置有点过期了,一两个属性不合法。 ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─honey │ │ │ ...
阅读 3550·2021-11-08 13:15
阅读 2106·2019-08-30 14:20
阅读 1385·2019-08-28 18:08
阅读 976·2019-08-28 17:51
阅读 1483·2019-08-26 18:26
阅读 2988·2019-08-26 13:56
阅读 1483·2019-08-26 11:46
阅读 2586·2019-08-23 14:22