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

发布于:2024-10-12 ⋅ 阅读:(113) ⋅ 点赞:(0)

设计思路

要通过注解实现对方法参数的校验,我们将利用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)。

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到