通过 Spring Boot 自定义注解、反射和 AOP 实现动态修改请求参数是一种灵活的设计方式。以下是实现过程的详细步骤和代码示例。
1. 自定义注解
首先,我们需要创建一个自定义注解,用于标记需要动态修改的请求参数。
DynamicParam.java
package com.example.annotations;
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 DynamicParam {
String value(); // 定义注解的属性,用于指定参数名
}
2. AOP 切面
接下来,创建一个 AOP 切面,拦截标记了自定义注解的方法,并修改请求参数。
DynamicParamAspect.java
package com.example.aspects;
import com.example.annotations.DynamicParam;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Arrays;
@Aspect
@Component
public class DynamicParamAspect {
@Around("@annotation(dynamicParam)")
public Object modifyRequestParam(ProceedingJoinPoint joinPoint, DynamicParam dynamicParam) throws Throwable {
Object[] args = joinPoint.getArgs();
// 假设我们只处理第一个参数为对象的情况
if (args.length > 0 && args[0] instanceof YourRequestObject) {
YourRequestObject requestObject = (YourRequestObject) args[0];
String paramName = dynamicParam.value();
// 根据参数名动态修改请求参数
if ("targetParam".equals(paramName)) {
requestObject.setTargetParam("modifiedValue"); // 修改参数值
}
}
return joinPoint.proceed(args); // 继续执行原方法
}
}
3. 请求对象
定义一个请求对象,用于接收请求参数。
YourRequestObject.java
package com.example.models;
public class YourRequestObject {
private String targetParam;
// Getter and Setter
public String getTargetParam() {
return targetParam;
}
public void setTargetParam(String targetParam) {
this.targetParam = targetParam;
}
}
4. 控制器
在控制器中使用自定义注解,处理请求。
YourController.java
package com.example.controllers;
import com.example.annotations.DynamicParam;
import com.example.models.YourRequestObject;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class YourController {
@PostMapping("/api/modify")
@DynamicParam("targetParam")
public String modifyRequest(@RequestBody YourRequestObject request) {
return "Received param: " + request.getTargetParam();
}
}
5. 测试
现在,你可以发送请求到 /api/modify
,并在请求体中包含 targetParam
。AOP 切面会拦截请求,并将 targetParam
的值修改为 modifiedValue
。
6. 总结
通过上述步骤,你实现了一个简单的示例,展示了如何使用自定义注解、反射和 AOP 动态修改请求参数。可以根据具体需求扩展逻辑,比如处理多个参数或不同的请求对象类型