当前位置: 首页 > article >正文

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 {

    @ValidatedParams
    public 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.kler.cn/a/323533.html

相关文章:

  • docker部署bitnami/etcd:latest
  • Fish Agent V0.13B:Fish Audio的语音处理新突破,AI语音助手的未来已来!
  • 机器学习 决策树
  • @Autowired 和 @Resource思考(注入redisTemplate时发现一些奇怪的现象)
  • Python_爬虫1_Requests库入门
  • opencv kdtree pcl kdtree 效率对比
  • 计算机毕业设计 在线问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • C++那些你不得不知道的(2)
  • .NET 控制台应用程序连接 MySQL 数据库实现增删改查
  • mysql数据库设置主从同步
  • 自动驾驶电车难题的康德式道德决策
  • 黑马头条day6-kafka及异步通知文章上下架
  • Spring 全家桶使用教程 —— 后端开发从入门到精通
  • C#——switch案例讲解
  • 计算机毕业设计 校园失物招领网站的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版
  • 【论文写作】描述一个模型比另一个模型效果好时
  • sentinel原理源码分析系列(二)-动态规则和transport
  • 如何在openEuler上安装和配置openGauss数据库
  • linux编辑文件保存退出的实操讲解
  • JVM基本了解
  • 神经网络激活函数
  • RabbitMQ 高级特性——重试机制
  • 【前端面试题】Vue 3 生命周期钩子的执行顺序详解
  • 2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡
  • Supervisor进程管理工具安装