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

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

    • 一、环境
      • 1-1.备注
    • 二、代码实现
      • 2-1.注解定义
      • 2-2.组定义
      • 2-3.constraints使用
      • 2-4.切面定义
      • 2-5.复用ValidatorFactory
      • 2-6.单测校验
      • 2-7.说明

一、环境

springboot+maven

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version>
</dependency>

1-1.备注

相关基础概念查看我的另外两篇博客,

AspectJ切面自定义注解实现参数分组校验——基础概念(1):
https://blog.csdn.net/weixin_36894490/article/details/125605142?spm=1001.2014.3001.5501

AspectJ切面自定义注解实现参数分组校验——基础概念(2):
https://blog.csdn.net/weixin_36894490/article/details/125610487?spm=1001.2014.3001.5501

二、代码实现

2-1.注解定义

/*** @author ZhangLiFang* @date 2022/7/1 10:01 PM* @Desc*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ValidGroupParam {Class<?>[] value() default Default.class;
}

2-2.组定义

/*** @author ZhangLiFang* @date 2022/7/1 11:41 PM* @Desc ValidGroupParam校验的参数组*/
public interface InboundOrderGroup {/*** 加款*/interface Inbound extends Default {}/*** 调额*/interface AdjustInCome extends Default {}}

2-3.constraints使用

/*** @author ZhangLiFang* @date 2022/7/1 5:24 PM* @Desc*/@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class InboundMidRequest implements Serializable {private static final long serialVersionUID = 8666517965899046452L;/*** 金额 默认组校验*/@NotNull(message = "金额不能为空")private BigDecimal amount;/*** 币种 对于加款组需要做校验*/@NotBlank(groups = InboundOrderGroup.Inbound.class, message="币种不能为空")private String currency;/*** 平台 对于调额组需要做校验*/@NotBlank(groups = InboundOrderGroup.AdjustInCome.class, message="平台不能为空")private String platform;
}

2-4.切面定义

/*** @author ZhangLiFang* @date 2022/7/1 10:13 PM* @Desc*/
@Aspect
@Component
public class ValidGroupParamAspect {@Resourceprivate ValidatorFactory factory;@Pointcut("@annotation(validGroupParam)")public void callAt(ValidGroupParam validGroupParam) {}@Around(value = "callAt(validGroupParam)", argNames = "pjp,validGroupParam")public Object around(@Valid ProceedingJoinPoint pjp, ValidGroupParam validGroupParam) throws Throwable {Validator validator = factory.getValidator();for (Object o : pjp.getArgs()) {Set<ConstraintViolation<Object>> violations = validator.validate(o, validGroupParam.value());for (ConstraintViolation<Object> violation : violations) {String errorMsg = violation.getMessage();throw new BizException(ErrorCode.PARAM_ERROR, errorMsg);}}return pjp.proceed();}}

2-5.复用ValidatorFactory

/*** @author ZhangLiFang* @date 2022/7/4 5:22 PM* @Desc*/
@Component
public class ValidatorTemplateFactory {@Beanpublic ValidatorFactory validatorFactory(){return Validation.buildDefaultValidatorFactory();}}

2-6.单测校验

针对加款组调用接口

@Slf4j
@Service
public class AnnotationTestService {@ValidGroupParam(InboundOrderGroup.Inbound.class)public void testAnnotation(InboundMidRequest inboundMidRequest){log.info("okkkk");}
}

单测1:缺少默认组参数,执行结果:金额不能为空

		@Testpublic void test_Annotation_ValidGroupParam_without_default_arg(){InboundMidRequest build = InboundMidRequest.builder().amount(null).currency("CNY").platform("平台").build();annotationTestService.testAnnotation(build);}

单测2:缺少调额组的参数,执行结果:okkkk

@Test
public void test_Annotation_ValidGroupParam_without_other_group_arg(){InboundMidRequest build = InboundMidRequest.builder().amount(new BigDecimal("100")).currency("CNY").platform("").build();annotationTestService.testAnnotation(build);
}

单测3:缺少加款组的参数,执行结果:币种不能为空

@Testpublic void test_Annotation_ValidGroupParam_without_own_group_arg(){InboundMidRequest build = InboundMidRequest.builder().amount(new BigDecimal("100")).currency("").platform("平台").build();annotationTestService.testAnnotation(build);}

单测结果表明,分组成功,@ValidGroupParam(InboundOrderGroup.Inbound.class)即可实现分组校验。

2-7.说明

@ValidGroupParam注解支持可多个组参数校验,同时也支持对方法的多个Object参数的constraints进行校验。即

@ValidGroupParam({InboundOrderGroup.Inbound.class, InboundOrderGroup.Inbound2.class})
public void testAnnotation(InboundMidRequest1 inboundMidRequest1, InboundMidRequest2 inboundMidRequest2){log.info("okkkk,too");
}

注意:以最先匹配到不符合的参数条件的一条message进行抛出异常告警。

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

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

相关文章

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…

JSP中 input type 用法

JSP中 input type 用法 Input表示Form表单中的一种输入对象&#xff0c;其又随Type类型的不同而分文本输入框&#xff0c;密码输入框&#xff0c;单选/复选框&#xff0c;提交/重置按钮等&#xff0c;下面一一介绍。 1&#xff0c;typetext 输入类型是text&#xff0c;这是我们…

java box unboxing

http://www.java2s.com/Tutorial/Java/0040__Data-Type/BoxingandUnboxing.htmBoxing and Unboxing1、Boxing refers to the conversion of a primitive to a corresponding wrapper instance, such as from an int toa java.lang.Integer. 2、Unboxing is the conversion of a…

Java的可重入锁

1.可重入锁Lock 锁主要是为了保护临界区资源&#xff0c;防止由于并发执行而引起的数据异常。而synchronized关键字就是一种最简单的控制方法。经过jdk1.6对synchronized的优化&#xff0c;Lock和synchronized的性能相差并不多。 那么为什么还需要Lock&#xff0c;这当然有它的…

创建oracle 数据库表空间,角色,用户的sql语句

创建oracle 数据库表空间&#xff0c;角色&#xff0c;用户的sql语句 1.创建角色 CREATE ROLE "QIUDINGROLE" NOT IDENTIFIED; GRANT "CONNECT" TO "QIUDINGROLE";GRANT "DBA" TO "QIUDINGROLE";GRANT "RESOURCE"…