Java中通过方法上注解实现入参校验

设计思路

要通过注解实现对方法参数的校验,我们将利用Java的反射机制以及Spring AOP(面向切面编程)来实现。这种设计使得参数校验与业务逻辑解耦,提高了代码的可读性和可维护性。

1. 需求分析
  • 自动化校验:不希望在每个方法内部进行详细的参数校验。
  • 灵活性:希望能自定义校验规则。
  • 可重用性:相同的校验逻辑能被多个方法复用。
2. 选择技术
  • Spring AOP:可以在方法执行之前执行参数校验,捕获异常并增强方法行为。
  • Java Bean Validation(JSR 380):提供标准的校验注解(如@NotNull, @Size等),保证参数的合法性。
3. 系统设计
  • 自定义注解:创建一个注解@ValidatedParams,通过它标记需要校验的方法。
  • 切面类(Aspect):实现切面来拦截带有@ValidatedParams注解的方法,对其参数进行校验。
  • 错误处理:在校验失败时抛出适当的异常,以便调用者可以捕获并处理。

 代码实现

1. 自定义注解

创建一个注解@ValidatedParams,它用来标识需要进行参数校验的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidatedParams {
}
2. 创建参数校验切面

使用Spring AOP创建一个切面,来实现参数校验逻辑。

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;@Aspect
@Component
public class ValidationAspect {private final Validator validator;public ValidationAspect() {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();this.validator = factory.getValidator();}@Before("@annotation(ValidatedParams)")public void validateParams(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();for (Object arg : args) {if (arg != null) {Set<ConstraintViolation<Object>> violations = validator.validate(arg);if (!violations.isEmpty()) {StringBuilder errorMessage = new StringBuilder();for (ConstraintViolation<Object> violation : violations) {errorMessage.append(violation.getMessage()).append(" ");}throw new IllegalArgumentException("Invalid parameters: " + errorMessage.toString().trim());}}}}
}
3. 实现参数校验

在实际需要校验的类和方法中,使用Java Bean Validation提供的注解。

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;public class DemoService {@ValidatedParamspublic void process(@NotNull(message = "Parameter cannot be null") String data,@Size(min = 5, message = "Length must be at least 5") String description) {// 业务逻辑处理System.out.println("Processing: " + data + " with description: " + description);}
}
4. 配置Spring环境

确保相关的AOP和Validation依赖在你的Spring项目中已经引入,通常在pom.xml中添加:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 这种设计提供了高水平的灵活性,并且避免了方法内部的冗长校验逻辑。通过AOP,我们能够在不干扰业务逻辑的前提下,集中处理参数校验,从而提升代码的整体可读性和可维护性。同时,利用注解的自描述性使得方法的要求一目了然。这种结构符合现代软件开发中倡导的单一职责原则(SRP)。

 

 

 

 

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

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

相关文章

xxl-job 适配达梦数据库

前言 在数字化转型的浪潮中&#xff0c;任务调度成为了后端服务不可或缺的一部分。XXL-JOB 是一个轻量级、分布式的任务调度框架&#xff0c;广泛应用于各种业务场景。达梦数据库&#xff08;DM&#xff09;&#xff0c;作为一款国内领先的数据库产品&#xff0c;已经被越来越…

【笔记篇】Davinci Configurator OS模块(上)

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 规范偏离2.2.1 API 函数的泛型偏离2.2.2 可信函数 API 偏离2.2.3 服务保护偏离2.2.4 代码保护2.2.5 SyncScheduleTable API 偏差2.2.6 CheckTask/ISRMemoryAccess API 偏差2.2.7 中断 API 偏差2.2.8 Cross Core Getter API2.2.9 …

Spring Boot 调用外部接口的常用方式!

使用Feign进行服务消费是一种简化HTTP调用的方式&#xff0c;可以通过声明式的接口定义来实现。下面是一个使用Feign的示例&#xff0c;包括设置Feign客户端和调用服务的方法。 添加依赖 首先&#xff0c;请确保你的项目中已经添加了Feign的依赖。如果你使用的是Maven&#xf…

Redis篇(应用案例 - 商户查询缓存)

目录 一、什么是缓存? 二、为什么要使用缓存 三、如何使用缓存 四、添加商户缓存 1. 缓存模型和思路 2. 代码如下 五、缓存更新策略 1. 内存淘汰 2. 超时剔除 3. 主动更新 六、数据库缓存不一致解决方案 1. 数据库缓存不一致解决方案 2. 数据库和缓存不一致采用什…

《关于浔川 AI 翻译 v3.0 延迟上线的通告》——浔川社团官方

尊敬的用户&#xff1a; 您好&#xff01; 首先&#xff0c;我们要向一直以来期待浔川 AI 翻译 v3.0 上线的各位用户致以最诚挚的歉意。原定于 [2024.9.19] 上线的浔川 AI 翻译 v3.0&#xff0c;由于 [安装失败原因]&#xff0c;将再次延迟至 2024 年 10 月 2 日上线。 我们…

AMD ROCm™ 安装指南

AMD ROCm™ installation — ROCm Blogs 注意: 本文之前是 AMD 实验笔记博客系列的一部分。 AMD ROCm™ 是第一个面向 HPC/超大规模级 GPU 计算的开源软件开发平台。AMD ROCm™ 将 UNIX 的选择权、极简主义和模块化软件开发哲学引入 GPU 计算领域。有关更多信息&#xff0c;请参…

【MySQL】函数及存储过程

MySQL函数和存储过程 函数 数据库中的函数是一种可重复使用的命名代码块&#xff0c;用于在数据库中执行特定的操作或计算。 在MySQL中提供了很多函数&#xff0c;为我们的SQL提供了便利 内置函数 mysql> select count(r_id),max(r_id),min(r_id),avg(r_id) from resume…

docker build 有时候不展示命令的输出情况,怎么办?

来源&#xff1a;https://stackoverflow.com/questions/64804749/why-is-docker-build-not-showing-any-output-from-commands docker build 有时候不展示命令的输出情况&#xff0c;不方便我们 debug&#xff0c;怎么办&#xff1f; 可以加上 docker build --progressplain …

C++和OpenGL实现3D游戏编程【连载10】——纹理的半透明显示

1、本节实现的内容 上一节课我们讲到了图片的镂空显示,它能在显示图片时去除指定颜色的背景,那么这节课我们来说一下图片的半透明显示效果,半透明效果能给画面带来更高质量的提升,使图片显示的更自然,产生更真实的效果。下面是一个气泡向上漂浮的效果。 气泡效果 2、非纹…

2024华为OD机试E卷-判断一组不等式是否满足约束并输出最大差-(C++/Java/Python)

2024华为OD机试最新E卷题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 考点分析 题目解析 代码 c++ python java 题目描述 给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分) 要求: 不等式系数为…

搜索引擎简介

搜索引擎架构 整个搜索引擎分为三个系统 爬虫系统 索引系统 线上搜素服务 爬虫系统 爬虫分为两个阶段&#xff1a; 第一阶段&#xff1a;根据目标网站的列表页&#xff0c;爬对应的文档 URL 第二阶段&#xff1a;根据文档 URL&#xff0c;下载文档内容 触发器&#xff1…

【行业报告】AI大模型对我国劳动力市场潜在影响研究报告(2024),附PDF下载!!

前言 9月13日&#xff0c;北京大学国家发展研究院联合智联招聘在中国国际服务贸易交易会上发布的《AI大模型对我国劳动力市场潜在影响研究&#xff1a;2024》&#xff08;以下简称“报告”&#xff09;显示&#xff0c;2024年上半年&#xff0c;招聘职位数同比增速前五的人工智…

数据结构——二叉树的性质和存储结构

二叉树的抽象类型定义 基本操作&#xff1a; CreateBiTree(&T&#xff0c;definition) 初始条件&#xff1a;definition给出二叉树T的定义。 操作结果:按definition构造二叉树T。 PreOrderTraverse(T) 初始条件:二叉树T存在。 操作结果:先序遍历T&#xff0c;对每个结…

基于Hive和Hadoop的白酒分析系统

本项目是一个基于大数据技术的白酒分析系统&#xff0c;旨在为用户提供全面的白酒市场信息和深入的价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark 为核…

LLM | Ollama WebUI 安装使用(pip 版)

Open WebUI (Formerly Ollama WebUI) 也可以通过 docker 来安装使用 1. 详细步骤 1.1 安装 Open WebUI # 官方建议使用 python3.11&#xff08;2024.09.27&#xff09;&#xff0c;conda 的使用参考其他文章 conda create -n open-webui python3.11 conda activate open-web…

Java五子棋

目录 一&#xff1a;案例要求&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a; 一&#xff1a;案例要求&#xff1a; 实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘&#xff0c;把每个元素赋值位“┼”可以画出棋…

不夸张、我就是这样考过PMP~

&#x1f335;方法虽然有点笨&#xff0c;但是按照这个方法认真学&#xff0c;60天过PMP真的来得及&#xff01;PMP是通过性考试&#xff0c;只要拿下及格分就行&#xff0c;选对学习方法两个月3A上岸稳稳的&#xff01;&#x1f53a;24年11月PMP考试时间&#xff1a;11月30日&…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…

SPI总结

1.前言 1.1 SPI简介 SPI全称Serial Peripheral Interface&#xff0c;串行外设接口&#xff0c;是一种用于连接外设的全双工通信总线。主机和从机支持一对一或一对多通讯连接。 图1 SPI物理层通讯连接 表1 Signal description 1.2 SPI特征 串行&#xff0c;每个时钟周期只传…