`

Hibernate Validator

 
阅读更多
http://oklook249900241.iteye.com/blog/1231096
Hibernate-validator是JSR303的一个实现。JSR303中定义了一种可以用Annotation来验证EntityBean信息 有效性的方式。虽然叫Hibernate-validator,但它是一个单独的jar文件,完全可以脱离Hibernate使用和扩展。

        其依赖于”validation-api.jar”,”slf4j-api.jar”,”jaxb-api.jar”以及”jaxb-impl.jar”。
        Maven项目可配置:
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.0.2.GA</version>
        </dependency>

        Hibernate-validator本身提供了诸多基本的验证比如,非空,长度,最大最小值,Email、RUL格式,范围,正则表达式等。如下:
        @NotNull 验证非null。
        @NotBlank 验证字符串非null,且长度必须大于0。
        @Size(min=,max=) 验证元素是否在min和max之间的,可用于验证字段长度,和集合个数。
        @Min 验证元素的值一定大于min指定的值。
        @Max 验证元素的值一定小于max指定的值。
        @Length(min=,max=) 验证字符串长度是否在min和max之间.
        @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
        @Email  验证字符串是否是合法的Email格式.
        @URL(protocol=,host=,port=) 验证字符串是否是合法的URL格式.
        @Range(min=,max=) 验证指定元素的值是否在指定范围之内。
        @Pattern(regex=,flag=)  根据指定的正则表达式来做特殊格式字符串的验证。
         ……
       
Example:
        public class Bean {
                @NotNull(message="not_null.bean.name")
                @Size(min=5,max=10,message="length.bean.name")
                private String name;

                @Digits(integer=3,fraction=4,message="digits.bean.num")
                private String num;

                @NotNull(message="not_null.bean.pass")
                @Length(min=6,max=12,message="length.bean.pass")
                private String pass;

                @NotNull(message="not_null.bean.age")
                @Max(60)
                @Min(10)
                private Integer age;

                @Email(message="email.bean.email")
                private String email;

                @Range(min=10000,max=50000,message="range.bean.wage")
                private BigDecimal wage;

        }

        每个Annotation都能指定message属性,这是在验证不通过时返回的信息。
        定义了EntityBean并加入Annotation后,我们可以在验证的类中使用如下方式来对Bean进行验证:

        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Pojo>> constraintViolations = validator.validate(pojo);
        for(Iterator<ConstraintViolation<Pojo>> i = constraintViolations.iterator(); i.hasNext();) {
                ConstraintViolation<Pojo> v = i.next();
                System.out.println(v.getMessage());
        }

        然而在很多情况下,上述验证并不能够完成我们的需求。在业务流程中会出现一些更加复杂的验证,如:当字段A为”Y”时,字段B必须不为空;或者当字段A- D中,要么A和B的总长度大于10,要么C和D的总长度大于10,否则返回错误。诸如这种情况,我们需要自定义一个Annotation来专门处理。

        首先,定义一个Annotation:
        @Retention(RUNTIME)
        @Constraint(validatedBy=JointNotNullValidator.class)
        @Documented
        public @interface JointNotNull {
                String message() default "{com.hp.validator.jointNotNull}";
                Class<?>[] groups() default {};
                Class<? extends Payload>[] payload() default {};
        }

        @Constraint 指定了具体处理验证过程的类。如下再定义一个处理类:JointNotNullValidator。
        public class JointNotNullValidator implements ConstraintValidator<JointNotNull, Object> {
                public boolean isValid(Object obj, ConstraintValidatorContext constraintContext) {
                        if(obj instanceof TestOBJ) {
                                TestOBJ testOBJ = (TestOBJ)obj;
                                if((testOBJ.getA()!=null&& testOBJ.getA().equals("Y")) && (testOBJ.getB()==null || testOBJ.getB().length()==0)) {
                                        return false;
                                }
                                return true;
                        }
                        return false;
                }
                public void initialize(JointNotNull joindNull) {
                }

        }

        处理类需要去继承ConstraintValidator接口,第一个泛型指定当前处理类属于哪个Annotation,第二个泛型指定被注解的Bean 类型。在isValid方法中实现具体的验证逻辑,即:当TestOBJ中的A为”Y”时,B必须不为空。initialize方法则可以做一些初始化操 作,比如获取调用者给定的value值和message值,都可以通过传入的参数(所属的Annotation对象)中得到。这样在有些验证中就能依赖于 给定的属性来做处理。
        完成后,就能将@JointNotNull 同其他Annotation一样使用了。

        有个注意点:
        在定义Annotation时可以定义@Target属性,如:

        @Target( { METHOD, FIELD, ANNOTATION_TYPE })
        @Retention(RUNTIME)
        @Constraint(validatedBy=TodayValidator.class)
        @Documented
        public @interface Today {

                String message() default "{com.hp.validator.today}";
                Class<?>[] groups() default {};
                Class<? extends Payload>[] payload() default {};

        }

        @Target其实是限制了当前Annotation的使用范围,比如现在这个就只能被用在方法,字段,和其它Annotation上,而不能放在类上。 如果被放在了字段上,那么在具体验证类中isValid方法的第一个参数被传入的就是被注解的字段对象,但如果放在了类上,那么isValid中得到的就 是整个类对象。而后者可以轻易得到这个类中其它字段的信息,以便解决需要依赖其它字段来做验证的情况,前者就只能对当前字段做验证,无法获取到其它字段信 息。

        因为验证的调用代码都是一样的,可以将其放到一个类中,由Spring的AOP做切面逻辑。这样只要做一个封装,我们就能将整个项目的验证都抽离到一个模块中做统一的验证管理,而在业务方法中就不需要再考虑参数验证问题了,可以更专注于业务逻辑。
分享到:
评论

相关推荐

    呼伦贝尔市-扎兰屯市-街道行政区划_150783_Shp数据-wgs84坐标系.rar

    呼伦贝尔市-扎兰屯市-街道行政区划_150783_Shp数据-wgs84坐标系.rar

    text13届真题二.zip

    text13届真题二.zip

    锡林郭勒盟-东乌珠穆沁旗-街道行政区划_152525_Shp数据-wgs84坐标系.rar

    街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用

    WPF实现工业级动态流体管道动画:C#代码解析与性能优化

    内容概要:本文详细介绍了如何使用WPF(Windows Presentation Foundation)实现逼真的工业组态软件中的流体管道动画。主要内容涵盖管道绘制、流体动画效果、动态速度控制以及性能优化等方面。首先,通过C#代码展示了如何使用几何图形和颜色动画创建动态变化的管道。接着,引入粒子系统和模糊效果来增强流体的真实感。为了实现流体速度的动态调整,文中提供了流速控制器的实现方法。此外,还讨论了基于帧刷新的性能优化技术和双重缓冲机制的应用。最后,文章提到了一些高级技巧,如Perlin噪声生成流速波动、粒子沿曲线运动、动态纹理等。 适合人群:对WPF开发感兴趣的中级及以上水平的开发者,尤其是那些希望深入了解WPF图形和动画特性的程序员。 使用场景及目标:适用于需要开发工业组态软件或其他涉及流体模拟应用的项目。主要目标是帮助开发者掌握如何使用WPF创建高效且视觉效果出色的流体动画。 其他说明:文中提供的代码片段可以直接应用于实际项目中,同时也鼓励读者进一步探索更多复杂的流体模拟技术。

    HCIA-Datacom高阶:vlan、vlanif、单臂路由、静态路由、ospf综合实验

    HCIA-Datacom高阶:vlan、vlanif、单臂路由、静态路由、ospf综合实验

    毕业论文 基于fpga的rs 232串口通讯逻辑设计说明书.doc

    毕业论文 基于fpga的rs 232串口通讯逻辑设计说明书.doc

    呼伦贝尔市-阿荣旗-街道行政区划_150721_Shp数据-wgs84坐标系.rar

    呼伦贝尔市-阿荣旗-街道行政区划_150721_Shp数据-wgs84坐标系.rar

    微电网能源管理中的随机博弈与Python实现:基于双网络架构的动态定价与负荷调度

    内容概要:本文详细介绍了微电网中能源管理的随机博弈模型及其Python实现。首先,通过构建MicrogridEnv类来模拟多方博弈环境,每个智能体可以进行买卖操作并调整负荷。接着,引入了ET网络用于处理价格博弈,ADL网络用于负荷预测。这两个网络通过策略梯度协同优化,共同实现动态定价和负载调度。文中展示了具体的训练过程和实验结果,证明了该模型在波动环境下能够显著提高系统收益稳定性。此外,还讨论了动态定价策略的具体实现,包括供需平衡系数计算和价格波动修正项的设计。最后,通过多智能体交互代码展示了真实的博弈过程,并进行了对比实验,验证了模型的有效性和优越性。 适合人群:对微电网能源管理和强化学习感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和开发微电网能源管理系统,旨在通过动态定价和负荷调度优化能源利用效率,提高系统收益和稳定性。 其他说明:本文不仅提供了详细的代码实现,还深入探讨了模型背后的理论依据和设计思路,帮助读者全面理解微电网能源管理中的随机博弈机制。

    皮秒分辨率的FPGA TDC技术研究.pdf

    皮秒分辨率的FPGA TDC技术研究.pdf

    【Java Web开发】Tomcat服务器配置与优化:面试专题及性能调优详解Tomcat服务器的

    内容概要:本文档《Tomcat面试专题及答案.pdf》详细介绍了Tomcat服务器的相关知识点,涵盖配置、优化、部署、内存与垃圾回收调优、Session处理、JMS远程监控、专业分析工具、Session数目查看、内存使用情况监视、类加载与对象回收情况打印以及Tomcat的工作模式。文档首先讲解了Tomcat的默认端口及修改方法,随后深入探讨了四种Connector运行模式(bio、nio、aio、apr)及其参数配置。接着介绍了三种Web应用部署方式,并阐述了Tomcat容器创建Servlet实例的原理。在优化部分,重点讨论了连接配置、内存调优、垃圾回收策略的选择,还涉及了共享Session的多种处理方案。最后,文档概述了一个HTTP请求在Tomcat内部的完整处理流程。 适合人群:有一定Java开发经验,特别是Web开发背景的研发人员和技术专家。 使用场景及目标:①准备技术面试,尤其是针对Tomcat相关问题;②优化现有基于Tomcat的应用系统性能;③深入了解Tomcat架构及其工作原理,以更好地进行应用部署和维护。 其他说明:文档内容详实,既适合初学者入门学习,也适合有一定经验的开发者深入研究。建议读者在实际工作中结合自身环境进行针对性配置与优化实践。

    软考中级-软件设计师知识点整理(一篇就过(3).html

    软考中级-软件设计师知识点整理(一篇就过(3).html

    MATLAB数据预测:融合多种机器学习与统计模型的时间序列预测方法

    内容概要:本文详细介绍了使用MATLAB进行数据预测的各种方法和技术细节,涵盖了现代的人工智能算法如LSTM、BP神经网络、RBF和Elman等,以及传统的统计方法如ARIMA和GM灰色预测。文中不仅提供了具体的代码实例,还分享了许多实用的经验和注意事项,强调了数据预处理的重要性。作者通过多个实际案例展示了不同算法在不同数据集上的表现差异,指出了选择合适算法的关键在于理解数据本身的特性。 适合人群:对时间序列预测感兴趣的科研人员、工程师以及有一定编程基础并希望深入理解MATLAB预测工具的学生。 使用场景及目标:适用于需要进行时间序列数据分析和预测的研究项目,旨在帮助读者掌握如何根据具体应用场景选择最合适的预测模型,并能够独立完成从数据准备到模型评估的全过程。 其他说明:文章特别提醒读者,在面对复杂多变的实际问题时,除了关注算法本身外,更要重视数据的质量和预处理步骤。此外,作者还提供了一些关于模型调优的小贴士,如调整LSTM层数、设置ARIMA参数等。

    沧州市-吴桥县--街道行政区划_130928_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接使用。

    流水线贴膜机:基于PLC与触摸屏的工业自动化控制及运动控制初学者指南

    内容概要:本文详细介绍了流水线贴膜机的控制系统设计,涵盖PLC与触摸屏的协同控制。具体包括上下气缸、夹紧气缸、输送带电机、贴膜伺服和旋转电机的控制逻辑。PLC程序实现了各部件的协调运作,而触摸屏提供了友好操作界面。文中不仅展示了完整的程序结构和关键代码片段,还分享了许多实际调试经验和常见问题解决方案。 适合人群:对工业自动化控制感兴趣的初学者,尤其是想要深入了解PLC编程和运动控制的技术人员。 使用场景及目标:适用于学习PLC编程、触摸屏设计、气缸和电机控制、伺服定位等基础知识。通过该项目,学习者可以掌握工业自动化系统的完整开发流程,理解各组件间的协作机制,并积累实际调试经验。 其他说明:项目支持博图V15.1及以上版本,强调模块化设计和良好的代码规范,有助于提高程序的可维护性和扩展性。文中提供的实例和技巧能够帮助初学者更好地理解和应用工业自动化控制技术。

    工业级激光雷达SLAM三维建图:基于点云算法与高精度云台系统的创新应用

    内容概要:本文详细介绍了自主研发的工业级三维扫描系统,该系统利用二维激光雷达与高精度单轴云台相结合,实现了高效、精准的三维点云建模。文章重点阐述了云台控制、数据同步、点云重建、滤波算法以及多雷达适配等方面的技术细节。云台控制系统采用裸机驱动程序,确保角度定位误差小于0.03度;数据同步方面,通过时间戳双缓冲机制和优化的时间对齐算法,提高了数据处理速度;点云重建部分,提出了改进的坐标转换矩阵,显著提升了重建精度;针对工业环境的特点,开发了多种滤波算法,有效去除噪点;此外,系统支持多种雷达的动态配置,增强了灵活性和适应性。 适合人群:从事激光雷达SLAM研究、三维建图、工业自动化领域的研究人员和技术人员。 使用场景及目标:适用于矿山、冶金、建筑等复杂工业环境中的三维数据获取和建模任务,旨在提高测绘效率和精度,降低设备成本,增强系统的鲁棒性和可靠性。 其他说明:文中提供了大量的代码片段和实际应用场景案例,强调了技术创新和实用性的结合,展现了从硬件设计到软件算法的全面解决方案。

    海洋气候与海洋生物数据集

    观测日期 位置 海洋位置名称(例如,马尔代夫大堡礁) 纬度 观测点纬度 经度 观测点经度 海温(°C) 海面温度(摄氏度) pH值 海水的酸度(较低意味着酸性更强,这是酸化的标志) 漂白严重程度 分类变量:无、低、中、高 观察到的物种 采样期间观察到的海洋物种数量 海洋热浪 布尔标志(真/假),指示SST是否>30°C 随着气候变化的加速,世界海洋正在经历重大变革。该数据集汇编了海面温度(SST)、pH值、珊瑚白化严重程度和生态关键海洋区物种观测的合成但真实的测量结果。它涵盖了2015年至2023年,模拟了海洋环境如何应对全球变暖、酸化和热浪。 该数据集的目标是支持机器学习、气候分析和生态建模

    邢台市-信都区--街道行政区划_130503_Shp-wgs84坐标系.rar

    街道级行政区划shp数据,wgs84坐标系,直接下载使用。

    赤峰市-敖汉旗-街道行政区划_150430_Shp数据-wgs84坐标系.rar

    赤峰市-敖汉旗-街道行政区划_150430_Shp数据-wgs84坐标系.rar

    【职场面试技巧】基于黄金30秒法则的自我介绍优化:高效传递价值与引导对话节奏设计

    内容概要:文章介绍了“自我介绍的黄金30秒法则”,强调在职场面试中,30秒内高效传递个人信息的重要性。研究表明,面试官通常在前30秒形成初步印象,因此自我介绍应在短时间内达成三个目标:明确身份、展现能力、激起进一步交流的兴趣。文章提供了“3+1结构”的自我介绍模板,即5秒介绍自己是谁,15秒概述经历,5~7秒阐述擅长领域,3~5秒表达求职意愿。同时,文章提醒避免冗长、无重点的介绍,强调用成果说话,并根据不同行业调整策略。此外,还提供了练习技巧和面试官可能的思考角度,以及如何加入个性化元素打造差异化标签。 适合人群:即将参加面试的求职者,特别是应届毕业生和有1-3年工作经验的职场新人。 使用场景及目标:①帮助求职者在面试中迅速建立良好第一印象;②指导求职者构建简洁有力的自我介绍;③提高求职者的面试成功率。 其他说明:为了更好地掌握这30秒法则,求职者应多加练习,确保自我介绍自然流畅,并根据不同的岗位和场景灵活调整内容。

    bugreport-2025-04-20-201320.zip

    bugreport-2025-04-20-201320.zip

Global site tag (gtag.js) - Google Analytics