- 浏览: 266133 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (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 938Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9731. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1780Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 1083Java内部类 目录 1 JAVA� ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2736Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1844Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4541Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之读写文件模式
2013-03-07 17:56 1631Java实现多线程读写数据 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 1098Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1655Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2552Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 92121,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 2035安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3187图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2917JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3559JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1614Java多线程 目录 1 线� ... -
代理模式
2012-06-13 14:12 1420代理模式 目录 1 代理� ... -
java垃圾回收机制
2012-06-11 11:30 2584Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
音乐_全栈开发_程序猿依力_实战文档库_1742857530.zip
移动开发_Android_基础框架_SAFApi组件开发_1742847786.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
app开发
网络工程师(中级)是软考(计算机技术与软件专业技术资格考试)的一部分,主要考察计算机网络基础、网络安全、网络管理、操作系统、数据库等内容,考试分为上午的基础知识选择题和下午的案例分析题。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
信息收集思维导图
本工具用于下载安装Office2019学生和家庭版。
智慧园区,作为智慧城市的重要组成部分,正借助5G、云计算、大数据等前沿技术,实现园区的全面智慧化升级。它不仅仅是技术的堆砌,更是园区管理模式和服务理念的革新。智慧园区通过构建统一的大数据平台,实现园区内各类数据的整合与共享,让管理者能够全局掌握园区运营状态,实现人、事、物的穿透式管理。 在5G技术的加持下,智慧园区的特色应用得以更加广泛和深入地开展。从便捷通行到智慧物联,从楼宇自控到企业服务,5G智慧园区为园区内的企业和员工提供了前所未有的便捷与高效。刷脸通行、车牌识别、访客线上预约等技术的应用,不仅提升了园区的安全等级,更让通行变得简单快捷。而智慧垃圾桶、路灯等物联网设备的引入,则让园区的环境管理更加智能化、精细化。此外,5G智慧园区还通过无人机巡检、无人驾驶等创新应用,为园区的安全管理、物资配送等方面带来了全新的解决方案。 值得一提的是,智慧园区的建设并不仅仅局限于硬件设施的升级,更在于服务模式的创新。通过园区APP、在线服务平台等渠道,智慧园区实现了园区服务的线上化、便捷化,让企业和员工能够随时随地享受到园区提供的各类服务。这种以人为本的服务理念,不仅提升了园区的整体服务水平,更增强了园区的吸引力和竞争力。总之,5G智慧园区的建设为园区的可持续发展注入了新的活力,也为未来城市的发展提供了有益的借鉴和启示。
[GESP202503 C++五级题解]:P11960:平均分配
Java 版-我的世界 Minecraft 1.21.1-fabric 模组
标题SpringBoot在昆仑科技文献系统中的应用研究AI更换标题第1章引言介绍SpringBoot框架在昆仑科技文献系统中的研究背景、意义、现状以及论文的方法和创新点。1.1研究背景与意义分析SpringBoot框架在文献系统领域的应用价值。1.2国内外研究现状综述SpringBoot框架在文献系统中的应用情况和发展趋势。1.3论文方法与创新点阐述本文采用的研究方法和创新点。第2章SpringBoot框架概述详细介绍SpringBoot框架的基本概念、核心特性和优势。2.1SpringBoot简介概述SpringBoot的定义、发展历程和基本特点。2.2核心组件与工作原理解释SpringBoot的核心组件及其工作原理。2.3SpringBoot的优势分析SpringBoot框架相比其他框架的优势。第3章昆仑科技文献系统分析对昆仑科技文献系统进行详细的需求分析和功能设计。3.1系统需求分析明确昆仑科技文献系统的功能需求和性能需求。3.2系统功能设计根据需求分析结果,设计昆仑科技文献系统的功能模块。3.3数据库设计设计满足系统需求的数据库结构。第4章SpringBoot在昆仑科技文献系统
Nvidia A6000 驱动 572.83-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.exe
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
蓝桥杯python
内容概要:本文详细介绍了毕业论文的撰写与答辩经验,涵盖了从选题、写作到答辩的全过程。首先,强调了选题的重要性,建议选择具有研究价值且聚焦于某一特定问题的课题。其次,分享了论文写作中的常见难题及其解决方案,如构建严谨的逻辑结构、加强数据分析等。接着,阐述了与导师的有效沟通方式,包括多交流、注重沟通质量等。此外,提供了答辩前的准备工作,如制作PPT、模拟演练等,并强调了答辩过程中的注意事项,如保持沉着、逻辑清晰、合理使用体态语等。最后,提醒了论文写作中常见的七个雷区,如引用不标脚注、格式不符要求等,以避免不必要的失误。 适合人群:正在撰写或即将撰写毕业论文的本科生、硕士生及博士生。 使用场景及目标:①帮助学生在选题阶段找到有价值的研究方向;②指导学生在论文写作过程中克服常见难题;③协助学生准备答辩,确保顺利通过答辩环节;④提醒学生避免论文写作中的常见错误,提高论文质量和答辩成功率。 其他说明:本文不仅提供了实用的操作建议,还分享了许多亲身经历的心得体会,旨在帮助学生顺利完成毕业论文的各个环节。文中提到的多个网站和工具也为学生提供了便捷的资源和支持。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。