1、简述
在实际开发中,参数校验是保障系统稳定和数据可靠性的重要措施。常规的校验方式包括 JSR 303 的注解校验以及自定义校验逻辑,但对于一些复杂的条件判断,使用这些方式会导致代码变得冗余和难以维护。Aviator 是一个高性能的表达式引擎,它能够简化复杂的逻辑判断并提升参数校验的灵活性。本文将介绍如何在 Spring Boot 中集成 Aviator,并利用它来实现灵活的参数校验。

2、优势
Aviator 是由中国团队开源的一款高性能、轻量级的 Java 表达式引擎。它支持丰富的数据类型和操作符,能够处理复杂的逻辑运算和自定义函数。相比其他表达式引擎(如 MVEL 和 Groovy),Aviator 更轻量且性能更优,特别适合高并发场景下的动态计算和参数校验。
📦 高性能:内部采用了字节码生成和优化,运行速度快。
📦 灵活性:支持动态编写表达式,便于扩展复杂的校验规则。
📦 轻量级:无需大量依赖,容易集成到 Spring Boot 项目中。
3、集成 Aviator
3.1 项目依赖
首先,确保你的 Spring Boot 项目中添加了 Aviator 依赖。在 pom.xml 文件中加入以下依赖:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
3.2 定义自定义注解
接下来,我们定义一个自定义注解 @AviatorValidation 用于标记需要校验的方法参数。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AviatorValidation {
String expression(); // Aviator表达式
String errorMessage() default "参数不符合要求"; // 错误信息
}
3.3 创建 AOP 切面
然后,我们创建一个 AOP 切面 ValidationAspect,用于拦截方法调用,并执行参数校验逻辑。
import com.googlecode.aviator.AviatorEvaluator;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.annotation.Annotation;
import java.lang.reflect.Parameter;
@Aspect
@Component
public class ValidationAspect {
@Around("execution(* com.example.demo..*(.., @AviatorValidation (*), ..))")
public Object validate(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 获取方法的 @AviatorCheck 注解
AviatorValidation aviatorCheck = method.getAnnotation(AviatorValidation.class);
if (aviatorCheck != null) {
// 准备参数值
Object[] args = joinPoint.getArgs();
String[] parameterNames = signature.getParameterNames();
Map<String, Object> env = new HashMap<>();
for (int i = 0; i < parameterNames.length; i++) {
env.put(parameterNames[i], args[i]);
}
// 使用Aviator校验表达式
Boolean result = (Boolean) AviatorEvaluator.execute(aviatorCheck.expression(), env);
if (!result) {
throw new IllegalArgumentException(aviatorCheck.errorMessage());
}
}
return joinPoint.proceed(); // 继续执行目标方法
}
}
3.4 在方法上使用注解
在需要校验的地方使用 @AviatorValidation 注解,指定校验表达式和错误信息。
@GetMapping("/test")
@AviatorValidation(expression = "param1 > 0 && param2 < 100", errorMessage = "param1 should be > 0 and param2 < 100")
public String test(@RequestParam int param1, @RequestParam int param2) {
return "Validation passed!";
}
在上述示例中,我们通过注解 @AviatorValidation 给方法定义了不同的参数校验逻辑。方法执行前会先进行拦截并检查是否符合条件,否则抛出异常并返回指定的错误信息。
4、 扩展功能
📦 多参数支持:可以将方法的多个参数通过 Map 传递给 Aviator 进行校验。
📦 自定义函数:注册 Aviator 自定义函数,如校验字符串是否包含特殊字符、校验日期格式等。
📦 配置化表达式:将表达式配置到数据库或配置文件中,方便动态修改校验规则。
5、总结
通过将 Aviator 与 AOP 结合,我们可以实现灵活的参数校验逻辑。这种方式不仅简化了校验逻辑的编写,而且提高了代码的可维护性。随着业务需求的变化,可以轻松地通过修改校验表达式来适应新的要求。
在实际应用中,可以扩展更多的校验规则和复杂的表达式,以满足多样化的业务需求。希望本文能为你在 Spring Boot 项目中的参数校验提供一些启示和帮助!