Java validation(java验证器实现)

Java validation
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
用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程 本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。 阅读详情

相关推荐

从DBC到ARXML:详解DaVinci Configurator中通信栈的自动化配置逻辑

本文深入解析了Vector公司DaVinci Configurator工具如何将DBC文件自动转换为符合AUTOSAR标准的ARXML配置,详细介绍了从DBC到ARXML的映射逻辑、自动化配置的边界与陷阱,以及工程实践中的优化策略。帮助工程师高效配置汽车电子系统中的通信协议,提升项目开发效率。

weixin_30279671的博客 717

java的validation框架(参数校验)

*** 自定义手机号注解*///注解的作用目标(可以设置作用在类,方法等等)@Target({ElementType.FIELD }) //注解的保留策略(注解的生命周期) @Retention(RetentionPolicy.RUNTIME) //不同之处:与注解关联的验证器//注解验证不通过时输出的信息String message() default "手机号验证错误";//约束注解在验证时所属的组别Class

weixin_45703155的博客 8898

如何玩转腾讯云轻量级服务器(新手向)

如何玩转腾讯云轻量级服务器(新手向) ​ 相信不少同学都想将自己的服务器部署到云服务器,让别人通过自己的域名就可以访问到自己的项目,而腾讯云轻量级服务器作为一个小型的应用,支持域名解析和可视化运维等。比较适合新手入门 ​ 本文服务器操作系统为Centos7 一. 购买以及基本配置 1.购买方式 ​ 本文主要面向新手,毕竟一般只有新手才会购买轻量级服务器。所以可以选择购买一年的来学习,以后再根据需要换,前提提示(轻量级服务器没有安全组的,开放端口直接开启防火墙里的即可) ​ 购买连接 购买完成后点击控制

qq_46160687的博客 1万+

Java代码简洁-validation参数校验

validation参数校验

weixin_43994244的博客 9118

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3250

西门子S7-1200PLC PID_Temp工艺指令在恒温控制中的实战应用

本文详细介绍了西门子S7-1200PLC中PID_Temp工艺指令在恒温控制系统中的实战应用。从硬件选型、安全接线,到TIA Portal软件组态、编程及核心PID_Temp指令调用,手把手指导搭建系统。重点讲解了利用指令自带的预调节与精确调节功能进行PID参数自整定,最终实现高精度、低波动的温度控制,适用于塑料成型、食品烘烤等多种工业场景。

i1j2k的博客 235

Java校验validate

validation 技术在Java中运用最早在2009 年,Java 官方提出了 Bean Validation 规范,而后经历了JSR303、JSR349、JSR380 三次标准的更迭,发展到了 2.0。Bean Validation 和 我们以前学习过的 JPA 一样,只提供规范,不提供具体的实现。因此实际使用过程,常用的是 hibernate 的校验组件:org.hibernate.hibernate-validator。

皮球 3634

【KITTI数据集中Raw_Data数据标定文件中的参数关系解读】

上一节本人将KITTI Odometry数据集中的参数文件进行了解释。本节主要针对一些做融合slam的人,将Raw_Data数据标定文件中的参数按照自己的理解做如下阐述。其中,所讲之处如有错误,欢迎各位批评指正。

weixin_43389152的博客 1526

JAVA validation的使用

validation 在Java中运用最早在2009 年,Java 官方提出了 Bean Validation 规范,而后经历了JSR303、JSR349、JSR380 三次标准的更迭,发展到了 2.0。Bean Validation只提供规范,不提供具体的实现。因此实际使用过程,常用的是Hibernate validation和Spring Validator校验机制。

m0_37062111的博客 2727

基于树莓派4B设计的厨房环境监测系统_368

本项目设计并实现了一种基于树莓派4B的厨房环境监测系统,提升厨房使用过程中的安全性与智能化水平。系统采用树莓派4B作为主控核心,集成DHT11温湿度传感器、MQ2烟雾传感器、火焰传感器、光敏传感器、水滴检测传感器等多种传感器,实现对厨房环境温湿度、烟雾、火焰、光照与溢水等参数的实时监测,并通过蜂鸣器进行本地报警。系统通过WIFI连接互联网,利用MQTT协议将环境数据上传至华为云物联网平台,实现远程可视化监控。

415

uniapp - 最新实现hbuilder项目运行到ios基座或苹果ios真机设备详细教程,如何在ios苹果手机上真机运行测试,IOS自定义基座在线打包调试(uniapp项目如何在苹果手机上运行调试)

uni-app,苹果,app,ios,设备,自定义基座,运行app到苹果手机,mac电脑,Xcode,hbuilderX,运行ios基座调试Uniapp,无需打包,苹果证书,ipa,运行失败,报错,无法启动,连接失败,出错,详细教程,如何解决这个问题,怎么办,申请iOS证书,运行项目到iOS基座,打包ios自定义基座,在iOS真机上运行,新手小白,超级详细的教程,dcloud如何苹果ios系统真机测试,调试基座失败,真机调试ios app,App基座安装后无法打开问题,真机运行时检测不到手机的问题或者基座安

✅ 精选推荐文章 1万+

Java参数校验详解:使用@Valid注解和自定义注解进行参数验证

很多时候我们需要使用不少if、else等等逻辑判断及验证,这样在进行一些重复的参数校验会很麻烦,且以后要维护也会吃力。 而这样就可以使用javax.validation。验证(Validation)常见的验证操作包括验证数据的类型、格式、长度、范围、唯一性等 javax.validation 包:Java SE 6+ 中引入了 javax.validation 包,作为 Bean Validation 规范的一部分。这个包提供了一组注解和接口,可以方便地进行数据验证。 使用正则表达进行手机号码的校验:

那仰望的人,心底的孤独和叹息 9983

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【已解决】无法解析符号‘validation‘

pom.xml中只加了spring-boot-starter-validation,需要再引入javax.validation。spring-boot-starter-validation:用于引入Hibernate Validator验证器。@NotEmpty注解是Java Bean Validation(JSR 303)规范的一部分。hibernate-validator:用于实现Java Bean Validation规范。validation,@NotEmpty飘红。

qq_40154083的博客 1339

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java校验bean_Bean Validation技术实现对Javabean的校验

概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validation技术,该技术是利用注解的方式,在javabean代码内部,利用注解实现校验,这样会将繁琐的工作变得简单。注:在阅读如下知识之前,要对注解有一些了解。来一个简单的Bean Validation实现...

weixin_36277054的博客 792

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java服务端中的数据验证:使用Bean Validation与Spring Validator的最佳实践

Bean Validation适合简单的验证需求,而Spring Validator则适用于需要复杂验证逻辑的场景。本文将探讨Bean Validation和Spring Validator这两种数据验证框架的使用及最佳实践,并通过代码示例展示如何在Java服务中实现数据验证。Bean Validation是一种Java标准,用于在Java类中定义约束条件,确保数据的有效性。Bean Validation主要通过注解的方式在模型类上定义规则,并且支持复杂的数据验证需求。在服务层或控制器中使用。

省赚客开发者博客 969

Bean Validation规范

以下内容转载自:https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/ Bean Validation规范介绍 JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证...

aar49191的博客 2271

Bean Validation 注解-约束验证(一)

企业级应用系统都是以数据为核心的,数据在系统内部体现为实体以及实体和实体之间的关系。无论是数据的增删改查、流程变迁、规则变换以及统计分析等,都跟实体脱离不了干系,在对实体的操作中,数据验证是重要的一步,系统的验证配置,可以减少很多繁琐的代码。在Java的分层架构中,从表示层到持久层,都需要对业务数据进行验证。   数据验证在 Java 分层结构的应用开发中占据着重要位置。Java EE 6

aline200的博客 2819

java bean 属性验证_Hibernate-Validation,java后端对象属性验证

一.依赖架包:validation-api-1.0.0.GA.jarhibernate-validator-4.3.1.final-1.0.0.jar二.校验工具类public class ValidationUtils {privatestatic Validator validator = Validation.buildDefaultValidatorFactory().getValida...

weixin_29582919的博客 298

Bean Validation

概述 Bean Validation 规范Bean 是 Java Bean 的缩写,在 Java 分层架构的实际应用中,从表示层到持久化层,每一层都需要对 Java Bean 进行业务符合性验证,如图 1 所示。然而对于同一个 Java Bean 的对象,在每一层都需要实现同样的验证逻辑时,这将是一项耗时且容易诱发错误的做法。Bean Validation 规范的目标就是避免多层验证的重复性。事实...

Rachel 461

第二章 SpringBoot项目构建 - Java Bean Validation自定义校验注解(ConstraintValidator)

ConstraintValidator 是 Spring 和 Java Bean Validation(也称为 JSR 380 或 Hibernate Validator)框架中用于创建自定义验证器的接口。它允许您定义自定义的验证逻辑,用于检查字段或方法参数是否符合特定的约束条件。

想做一个小孩的杨先生的博客 1219

java jsr 303_java对象校验(validation)-JSR303规范

JSR303 规范简介web开发有一句名言:永远不要相信用户输入,在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情...

weixin_31319027的博客 1089

bigdecimal大于0_Java Bean Validation 2.0 (二): 自定义校验规则

前言Jakarta Bean Validation API定义了丰富的内建注解支持数据的约束验证,如@NotNull、@NotEmpty等,chengco:Java Bean Validation 2.0: 对Spring Boot应用的数据验证​zhuanlan.zhihu.com上篇文章已经列举了全部的内建注解,但这些只是最通用的验证规则,对于千奇百怪的业务需求,显然是不能全部满足的,所以需要...

weixin_29661407的博客 2058

Java Validator自定义日期范围验证注解:实现不超过一年的时间跨度校验

在实际的业务开发中,我们经常需要对用户输入的时间范围进行校验,比如限制查询时间跨度不能超过一年。虽然Java提供了丰富的日期时间API,但针对特定业务规则的验证仍然需要我们自定义实现。这不,在最近的工作中需要实现dataTracking相关功能,免不了对数据处理跨度进行限制。为了方便在多个VO类中进行复用验证,我们实现了验证注解以满足实际业务需求。本文将详细介绍如何通过自定义注解和验证器来实现"时间跨度不超过一年"的校验逻辑,并探讨其中涉及的日期计算理论。

勤于笔记,成于点滴。 1198

java篇-(java使用内嵌Tomcat开发javaWeb项目-中级篇)

java使用内嵌tomcat开发web项目写在前面在pom.xml里面加入spring相关依赖编写spring相关配置及代码java语言添加spring的DispatcherServlet,并在main方法里面调用添加spring-mvc.xml根据配置文件,创建对应测试文件启动项目,通过浏览器访问使用kotlin语言添加DispatcherServlet启动项目,使用浏览器访问添加json序列化支持pom文件里面添加fastjson依赖在配置文件里面添加fastjson序列化支持在controller添加

qq_42413011的博客 2437

hibernate validation内置注解及自定义注解

1 Bean Validation 中内置的 constraint 2 @Null 被注释的元素必须为 null 3 @NotNull 被注释的元素必须不为 null 4 @AssertTrue 被注释的元素必须为 true 5 @AssertFalse 被注释的元素必须为 false 6 @Min...

weixin_30689307的博客 137
上一篇: Memo class备注类信息
下一篇: itext生成pdf文件下载
xmong
博客等级 码龄19年 33粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值