- 浏览: 264129 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java validation
1. java验证器
在java开发中我们有很多场景都会对java的属性值进行验证,如web开发中表单提交数据后台数据处理中需要对传入的值进行验证,当然目前java有很多开源属性值验证框架,如hibernate validation,spring框架中也提供了相应注解验证spring validation,相比两款验证本人觉得hibernate的提供的正则数据验证比较好用,但是这些验证比较通用,很多时候也没办法完全支持我们一些特殊场景的使用,比如我想要验证某个属性的值是否存在于某个枚举类中,有些特殊值想要特殊验证处理等,基于这些场景自己不得不另起炉灶,实现一些简单的java注解验证功能。
2. java验证案例
下面通过注解构建两种简单验证方式来完成自定义验证器的简单实现,如下面要实现该数据类TestObject的验证,通过自定义注解构建验证验证策略进行验证:
自定义注解
要实现对不同注解的验证采用策略模式来实现,不同的验证实现类不同。
验证服务接口
验证实现类
运行结果为: true
1. java验证器
在java开发中我们有很多场景都会对java的属性值进行验证,如web开发中表单提交数据后台数据处理中需要对传入的值进行验证,当然目前java有很多开源属性值验证框架,如hibernate validation,spring框架中也提供了相应注解验证spring validation,相比两款验证本人觉得hibernate的提供的正则数据验证比较好用,但是这些验证比较通用,很多时候也没办法完全支持我们一些特殊场景的使用,比如我想要验证某个属性的值是否存在于某个枚举类中,有些特殊值想要特殊验证处理等,基于这些场景自己不得不另起炉灶,实现一些简单的java注解验证功能。
2. java验证案例
下面通过注解构建两种简单验证方式来完成自定义验证器的简单实现,如下面要实现该数据类TestObject的验证,通过自定义注解构建验证验证策略进行验证:
package com.annotation.validate; /** * 注解验证对象 * @author xmong */ public class TestObject { /** * 注解验证名字只能是字母下划线 */ @PatternType(pattern="^\\w*$") String name; /** * 注解验证性别值是否为性别枚举类型中的值 */ @EnumType(classType=Sex.class) String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
自定义注解
package com.annotation.validate; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 正则类型的注解 * @author xmong */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface PatternType { /** * 注解正则 * @return */ public String pattern(); /** * 注解提示信息 * @return */ public String info() default AnnotationConfig.DEFAULT_INFO; }
package com.annotation.validate; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 枚举类型注解 * @author xmong */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface EnumType { /** * 注解class类型 * @return */ @SuppressWarnings("rawtypes") public Class classType(); /** * 注解提示信息 * @return */ public String info() default AnnotationConfig.DEFAULT_INFO; }
package com.annotation.validate; /** * 枚举类 * @author xmong */ public enum Sex { MAN,WOMEN }
要实现对不同注解的验证采用策略模式来实现,不同的验证实现类不同。
package com.annotation.validate; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** * 验证测类,不同的验证类型需要不同验证服务来完成 * @author xmong */ public class AnnotationValidationStrategy { static Map<String, AnnotationValidationService> annotationValidationServiceMap; //静态资源初始化加载 static{ init();//初始化测类 } public static void init(){ /** * 构建验证测类服务Map,根据注解类型关联相应的验证服务 */ annotationValidationServiceMap = new HashMap<String, AnnotationValidationService>(); annotationValidationServiceMap.put(EnumType.class.getSimpleName(), new AnnotationValidationEnum()); annotationValidationServiceMap.put(PatternType.class.getSimpleName(), new AnnotationValidationPattern()); } //默认验证方法 public static boolean validateAnnotation(Object obj) throws ValidateException{ return validateAnnotation(obj, false); } /** * 遍历对象属性,根据不同的注解类型调用对应的验证服务对属性值进行验证 * @param obj 验证对象 * @param flag 值为null时是否验证 * @return 验证通过返回true,反之既然 * @throws ValidateException */ public static boolean validateAnnotation(Object obj, boolean flag) throws ValidateException{ if(null == obj) return false; Field[] fields = obj.getClass().getDeclaredFields(); //遍历对象属性 for (Field field : fields) { /** * 遍历属性注解,根据注解类型名调用相应的验证服务验证该属性 */ Annotation[] annotations = field.getAnnotations(); for (Annotation annotation : annotations) { String type = annotation.annotationType().getSimpleName(); AnnotationValidationService annotationValidationService = annotationValidationServiceMap.get(type); //判断服务是否存在,不存在则抛出异常 if(null == annotationValidationService){ String msg = String.format("AnnotationValidationService '%s' is null!", type); throw new ValidateException(msg); }else if(!annotationValidationService.validate(field, obj, flag)){ return false; } } } return true; } public Map<String, AnnotationValidationService> getAnnotationValidationServiceMap() { return annotationValidationServiceMap; } }
验证服务接口
package com.annotation.validate; import java.lang.reflect.Field; /** * 验证接口 * @author xmong */ public interface AnnotationValidationService { /** * 验证接口方法 * @param field 需要验证的域 * @param obj 需要验证的 * @param flag 是特殊值标识通过位 * @return */ public boolean validate(Field field, Object obj, boolean flag) throws ValidateException; }
验证实现类
package com.annotation.validate; import java.lang.reflect.Field; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正则验证 * @author xmong */ public class AnnotationValidationPattern implements AnnotationValidationService{ public boolean validate(Field field, Object obj, boolean flag)throws ValidateException { //判断该属性是否有改验证注解 if(!field.isAnnotationPresent(PatternType.class)) return false; return validateValue(field.getAnnotation(PatternType.class), field, obj, flag); } public boolean validateValue(PatternType patternType, Field field, Object obj, boolean flag) throws ValidateException{ try { //设置属性的读取值权限 field.setAccessible(true); Object object = field.get(obj); //根据标识判断属性值是否为null if(object == null && flag) return flag; //正则表达式验证属性值 Pattern pattern = Pattern.compile(patternType.pattern()); Matcher matcher = pattern.matcher(object.toString()); return matcher.matches(); } catch (IllegalArgumentException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch(Exception e){ e.printStackTrace(); throw new ValidateException(e.getMessage()); } } }
package com.annotation.validate; import java.lang.reflect.Field; /** * 枚举类型验证 * @author xmong */ public class AnnotationValidationEnum implements AnnotationValidationService{ public boolean validate(Field field, Object obj, boolean flag) throws ValidateException { if(!field.isAnnotationPresent(EnumType.class)) return false; return validateEnum(field.getAnnotation(EnumType.class), field, obj, flag); } @SuppressWarnings("unchecked") public boolean validateEnum(EnumType enumType, Field field, Object obj, boolean flag) throws ValidateException{ try { field.setAccessible(true); Object object = field.get(obj); if(object == null && flag) return flag; //验证值是否为该注解枚举类中的值 if(null == Enum.valueOf(enumType.classType(), object.toString()))return false; return true; } catch (IllegalArgumentException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (IllegalAccessException e) { e.printStackTrace(); throw new ValidateException(e.getMessage()); } catch (Exception e){ e.printStackTrace(); throw new ValidateException(e.getMessage()); } } }
package com.annotation.validate; /** * @author xmong */ public class Test { public static void main(String[] args) { TestObject to = new TestObject(); to.setName("xmong"); to.setSex("MAN"); try { boolean flag = AnnotationValidationStrategy.validateAnnotation(to); System.out.println(flag); } catch (ValidateException e) { e.printStackTrace(); } } }
运行结果为: true
发表评论
-
Memo class备注类信息
2014-03-18 09:52 909Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9571. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1744Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 1066Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2716Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1828Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4530Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1608Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 1080Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1631Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2519Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 91831,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 2004安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3150图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2905JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3533JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1585Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1397代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2569Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
Java XML Validation API是Java平台中用于验证XML文档的重要工具,它是Java API for XML Processing (JAXP)的一部分。XML(eXtensible Markup Language)是一种用于标记数据的标准格式,广泛应用于数据交换、配置...
Bean Validation 是一个基于 Java 的参数验证框架,提供了多种注解来实现参数验证。Bean Validation 框架的使用非常简单,下面是一个简单的示例: 首先,需要在 Maven 项目中添加以下依赖项: ```xml <groupId>...
4. **自定义验证器**:当内置的验证规则不能满足需求时,可以通过实现`javax.validation.ConstraintValidator`接口来自定义验证器。这样可以创建自己的验证注解和对应的验证逻辑。 5. **Spring Framework中的验证**...
Java Validation API的核心概念包括验证注解、约束声明、验证器和验证上下文。 在Java应用中,Validation API的实现往往依赖于一个提供者,例如Hibernate Validator,这是一个流行的实现,它提供了对标准注解的扩展...
配置简单,可自由扩展验证器,实际只要实现IValidator接口,以及在rules.fo.xml中添加相关的配置即可; 支持Spring接口; 使用过程中,你会感觉好像只用了 IValidateService.validate() 一个方法,这会让人感觉良好...
`validation`通常指的是Hibernate Validation框架,这是一个符合JSR 303和JSR 349标准的Java Bean验证实现。它允许开发者定义一组约束规则,并在运行时自动检查这些规则,如果违反规则,就会抛出异常。这个框架不仅...
Java Web Jquery表单验证 jQuery是一个流行的JavaScript库,可用于在网页上进行各种操作,包括表单验证。 1、将基于Jquery的表单验证的调查问卷分为四个部分:FrontPage.html、write.html、end.html、style.css。 1...
`validation-framework`可能支持多种编程语言,如Java的Hibernate Validator、JavaScript的Joi等,它们都有各自的API和用法,但基本原理相同,都是通过定义规则和使用验证器来完成数据验证。 ### 集成到项目中 在...
Java Validation API 是一个用于验证对象模型的框架,它允许开发者定义数据校验规则,并在运行时检查这些规则是否被遵循。在标准的API中,已经提供了很多预定义的注解,如 `@NotNull`, `@Size`, `@Pattern` 等,用于...
2. 创建验证器:每个验证注解对应一个验证器,实现验证逻辑。 3. 注解解析:使用反射遍历对象的字段,查找并解析注解。 4. 执行验证:调用对应的验证器进行验证,收集错误信息。 5. 错误处理:将验证结果以适当的...
它扩展了基本的约束验证功能,提供了丰富的验证注解和自定义验证器的机制。在描述中提到的"结合hibernate-validator对实体做约束验证配置",意味着我们可以利用Hibernate Validator在实体类上添加注解,如@NotNull、...
使用Java实现的灵活验证库。 最新版本: 安装 Gradle是唯一受支持的构建配置。 步骤1.将JitPack存储库添加到构建文件中将其添加到存储库末尾的root build.gradle中: allprojects { repositories { maven { url...
JAVA中通过Hibernate-Validation进行参数验证 JAVA中通过Hibernate-Validation进行参数验证是JAVA服务器端代码开发中的一种常用技术。在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而...
Java Validation Framework(JVF)是一个开源的解决方案,旨在帮助开发者在Java应用程序中高效地处理业务规则验证。在快速发展的IT环境中,业务需求的频繁变化给系统设计和开发带来了挑战。为了应对这些变化,JVF...
Struts2是一个强大的Java EE应用程序开发框架,特别适用于构建MVC(模型-视图-控制器)架构的应用。在Struts2中,Validation框架是用于处理数据验证的重要组件,它允许开发者在用户输入提交到服务器之前或之后进行...
- `javax.swing.JComponent`类提供了`setInputVerifier`方法,可以设置输入验证器对象,如`InputVerifier`,实现基本的验证功能。 7. **Apache Commons BeanUtils**: - Apache Commons项目提供了一套BeanUtils...
在Java后端,可以使用如Hibernate Validator或Bean Validation框架进行验证。 7. **错误处理**:当验证失败时,JSValidation通常会显示错误提示。开发者可以通过配置错误消息和错误显示位置来优化用户体验。 8. **...
综上所述,这个压缩包提供了一套完整的验证解决方案,包括了实际的验证实现(Hibernate Validator)、日志记录工具(JBoss Logging)以及验证接口和规范(Bean Validation API)。这三者结合,可以方便地在Java项目...
Java Validation API,作为JSR 303标准的一部分,为JavaBean提供了一种优雅的方式来执行数据验证。这个API允许开发者通过注解来定义验证规则,从而简化了业务逻辑中的参数校验。下面我们将详细讨论其使用方法和常见...
它允许开发者为每个输入字段指定一个或多个验证器,这些验证器会在用户输入时或在提交表单前进行检查。验证器可以检查数据的类型、格式、范围等,例如检查电子邮件地址的正确格式、数字是否在指定范围内,或者字符串...