AspectJ切面自定义注解实现参数分组校验——基础概念(1)

AspectJ切面自定义注解实现参数分组校验——基础概念(1)

    • 一、环境
    • 二、validation-api源码解读
      • 2-1.Default源码解读
      • 2-2.valid源码解读
      • 2-3.Validation源码解读

一、环境

maven

需要引入的依赖:

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency>

二、validation-api源码解读

通常使用validation-api对参数校验会使用@valid注解配合@NotBlank@NotNull等注解使用进行参数校验。

	@NotNull(message = "金额不能为空")private BigDecimal amount;/*** 币种*/@NotBlank(message="币种不能为空")private String currency;

但是,当前@valid只支持对Default组进行校验。也就是说,不支持对参数进行分多个组校验。

2-1.Default源码解读

Default接口Reference如下,

javax.validation.groups.Default
public interface Default {
}

Default源码阐述如下,

Default Bean Validation group.
Unless a list of groups is explicitly defined:
constraints belong to the Default group
validation applies to the Default group
Most structural constraints should belong to the default group.

可以看出,constraints(指@NotBlankNotNull等注解)默认是归属默认组,Validation验证的也只是默认组。

除非明确的定义了其他一些组。即Valid注解只是针对默认组进行验证。

2-2.valid源码解读

Valid注解Reference如下,

javax.validation.Valid
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface Valid {
}

Valid源码阐述如下,

Marks a property, method parameter or method return type for validation cascading.
Constraints defined on the object and its properties are be validated when the property, method parameter or method return type is validated.
This behavior is applied recursively.

可以看出,当constraints@valid注解做一种关联映射时,虽然constraints是定义在object侧,但是对于使用了@valid注解的属性、方法参数、方法返回参数,对应的object侧定义的constraints,均会进行校验。这种行为应用是一种递归形式。

2-3.Validation源码解读

Validation类Reference如下,

javax.validation.Validation

Validation类的构成如下,

在这里插入图片描述

Validation是支持用户自定义,来对Bean进行验证的一个类。源码提供了3种版本的思路:

1)思路一

直接构造默认的ValidatorFactory,

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

这种情况下,校验的提供者,可以通过XML配置定义;如果没有定义,会使用ValidationProviderResolver返回的第一个ValidationProvider作为校验的提供者。ValidationProviderResolver可以保证运行时环境的可用性。

2)思路二

当然,也可以使用固定的ValidationProviderResolver,即自己实现一个ValidationProviderResolver来作为providerResolver(ValidationProviderResolver resolver)的参数(如下:new MyResolverStrategy())。

Configuration<?> configuration = Validation.byDefaultProvider().providerResolver( new MyResolverStrategy() ).configure();ValidatorFactory factory = configuration.buildValidatorFactory();   

3)思路三

Configuration实现一个自定义的子接口,来作为特定的校验提供者(如下:ACMEConfiguration)。

可以实现ValidationProvider接口的自定义的子接口(如下:ACMEProvider),作为byProvider(Class<U> providerType)的参数。

ACMEConfiguration configuration = Validation.byProvider(ACMEProvider.class).providerResolver( new MyResolverStrategy() )  // optionally set the provider resolver.configure();ValidatorFactory factory = configuration.buildValidatorFactory();  

值得注意的是,上述构建的ValidatorFactory需要被缓存,使Validator消费者共享使用同一个ValidatorFactory

javax.validation.ValidatorFactory#getValidator

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【注册机】ColorSchemer Studio 2.1.0 注册机

下载地址&#xff1a;http://files.cnblogs.com/boringlamb/keygencs.rar转载于:https://www.cnblogs.com/boringlamb/archive/2010/09/01/1815264.html

AspectJ切面自定义注解实现参数分组校验——基础概念(2)

AspectJ切面自定义注解实现参数分组校验——基础概念&#xff08;2&#xff09;一、环境二、创建AspectJ2-1.基础概念2-2.Pointcut规则表达式2-3.切点标志符pointcut designator (PCD)1&#xff09;execution2&#xff09;within3&#xff09;this和target4&#xff09;args5&a…

5230主题下载

最近朋友买了新手机&#xff0c;可是她又是电脑白痴&#xff0c;告诉她要她用百度搜&#xff0c;硬是没找到&#xff0c;百般无奈我千挑万选&#xff0c;找到了这个网站&#xff0c;让方便也同样带给同样不知道怎么用百度的朋友了5230主题下载网址&#xff1a;http://d.958shop…

AspectJ切面自定义注解实现参数分组校验——代码实现(3)

AspectJ切面自定义注解实现参数分组校验——代码实现&#xff08;3&#xff09;一、环境1-1.备注二、代码实现2-1.注解定义2-2.组定义2-3.constraints使用2-4.切面定义2-5.复用ValidatorFactory2-6.单测校验2-7.说明一、环境 springbootmaven <dependency><groupId&…

solaris下修改 IPMP 配置

使用 IPMP 配置文件 /etc/default/mpathd 为 IPMP 组配置以下系统范围的参数。 FAILURE_DETECTION_TIME TRACK_INTERFACES_ONLY_WITH_GROUPS FAILBACK 如何配置 /etc/default/mpathd 文件 在具有 IPMP 组配置的系统上&#xff0c;承担主管理员角色或成为超级用户。 主管理员角色…

电力自动化及继电保护实验室规章制度

为了按时完成电力自动化及继电保护实验&#xff0c;确保实验时人身安全与设备安全&#xff0c;要严格遵守如下规定的安全操作规程 一、 仔细阅读实验指导书内容&#xff0c;严格按实验指导书中的步骤来做试验。 二、 实验时&#xff0c;人体不可接触带电线路。 三、 接线或拆线…

主板跳线连接技巧图解

作为一名新手&#xff0c;要真正从头组装好自己的电脑并不容易&#xff0c;也许你知道CPU应该插哪儿&#xff0c;内存应该插哪儿&#xff0c;但遇到一排排复杂跳线的时候&#xff0c;很多新手都不知道如何下手。 钥匙开机其实并不神秘 还记不记得你第一次见到装电脑的时候…

几个不同的概念

站点 虚拟目录2个是不同德概念。站点需要应用程序池去生效。转载于:https://blog.51cto.com/vaxvax0000/390912

VMWARE双机安装说明

详见附件。 开始创建第一台机器&#xff1a;WIN2003 NODE1这里虚拟硬盘可以尽量选择大点,然后点“完成”进行创建就OK了。配置NODE1&#xff1a;把内存调整到256M以上&#xff0c;然后点“Add”增加一块网卡&#xff1a;网卡添加完后&#xff0c;再点“Add” 添加共享磁盘&…

GridView 中 Bind和Eval的区别详解

Eval()方法在运行时使用反射执行后期绑定计算&#xff0c;因此与标准的ASP.NET数据绑定方法bind相比&#xff0c;会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法 Eval 方法是静态&#xff08;只读&#xff09;方法&#xff0c;该方法采…

为什么每个线程都需要创建一个栈?

有四个函数A、B、C、D&#xff0c;地址分别为100、200、300、400&#xff1b;有两个线程同时执行&#xff1b; 1&#xff09;假如只有一个栈 函数A在线程1中执行的时候&#xff0c;调用了函数B&#xff0c;将函数A中下一条指令的地址入栈&#xff08;104&#xff09;&#xff…

创建线程时,需要创建的内容

请参看文献&#xff1a;线程调度&#xff0c;这样就能明白为什么需要有TCB&#xff0c;栈等&#xff1b; 创建线程时&#xff0c;需要初始化的参数&#xff1a; void ThreadCreate(A){TCB *tcbmalloc(); //申请一段内存作为TCB* stackmalloc(); //申请一段内存作为栈* st…

莎士比亚,肯尼迪总统,孔子,奥巴马总统,马克吐温,梵高,比尔盖茨等13位名人阔谈微博(中英双语版本)...

2019独角兽企业重金招聘Python工程师标准>>> 作者: ganzhijie 发表于 2010-09-02 10:11 原文链接 阅读: 21 评论: 0 John F. Kennedy-“Ask not what your twitter can do for you, ask what you can do for your twitter.”肯尼迪总统-“不要问你的微博能为你做些什…

Scala中=gt;的用法

1.匿名函数 (x: Int) > x 1这一部分就是一个匿名函数&#xff0c;我这里使用了一个变量anonymousFun代替了这个匿名函数方便测试调用&#xff1b;>左边是参数和参数类型&#xff0c;而>右边是函数体&#xff0c;并没有函数名。 val anonymousFun (x: Int) > x …

sql server 游标的使用

1 --zhxia2 DECLAREusernameVARCHAR(20),flagBIT,ncountint3 DECLAREmycursor CURSORFOR--声明游标4 SELECTuser_nameFROMRBAC_User5 OPENmycursor --打开游标6 SETflag07 SETncount08 WHILE(flag0)9 BEGIN10 SETncountncount111 FETCHmycursor INTOusername--循环读取游标12 I…

续——《RedHat/Fedora等非ubuntu的Linux系统星空极速netkeeper拨号上网 》

小补充&#xff0c;在上一篇转载的文章中《RedHat/Fedora等非ubuntu的Linux系统星空极速netkeeper拨号上网》中提到&#xff5b;方法一&#xff0c;Debian下突破星空极速拨号用了一个“pon”命令&#xff0c;完整的拨号命令是“pon dsl-provider”&#xff0c;&#xff5d;&…

Java中Thread类的方法简介

1.新建线程 Thread t1 new Thread(); t1.start(); 新建线程&#xff0c;应该调用start()方法启动线程&#xff1b;如果直接调用run()方法&#xff0c;该方法也会执行&#xff0c;但会被当做一个普通的方法&#xff0c;在当前线程中顺序执行&#xff1b;而如果使用start()方法…

centos 本地化配置

2019独角兽企业重金招聘Python工程师标准>>> 最近使用svn更新的时候经常出现一些奇怪的错误。经过查询得知是本地化环境没有配置&#xff0c;导致的。记录以下解决方法。 本人环境&#xff1a;centos 5.x 错误现象&#xff1a; [Copy to clipboard]View Code ERRORs…

MySQL连接查询

1.分类 MySQL连接可以分为&#xff1a; 1&#xff09;内连接 2&#xff09;外连接 左外连接右外连接全外连接 3&#xff09;自然连接 自然内连接(NATURAL JOIN)自然左外连接(NATURAL LEFT JOIN)自然右外连接(NATURAL RIGHT JOIN) 4&#xff09;交叉连接 2.语法 SELECT…

IP编址(包括网络地址和广播地址)

1.总述 IP地址使用32位二进数表示&#xff0c;每一个主机或路由器的接口都有全局唯一的IP地址&#xff08;NAT是个例外&#xff09;&#xff0c;它由网络号(NetID)和主机号(HostID)组成&#xff0c;它可以分为五类&#xff0c;如下&#xff1a; 2.地址划分 1&#xff09;A…