带方法参数的Spring AOP方面建议
我有如下方面的建议带方法参数的Spring AOP方面建议,spring,spring-mvc,aop,aspectj,spring-aop,Spring,Spring Mvc,Aop,Aspectj,Spring Aop,我有如下方面的建议 @AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))") public void fixUrl() .... getAttribute方法只接受一个字符串参数 我想做的是,我希望“fixUrl”仅在“name”字符串作为参数给定时执行。“getAttribute('name')”。我该怎么做?谢谢 @AfterReturning(v
@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
public void fixUrl()
....
getAttribute方法只接受一个字符串参数
我想做的是,我希望“fixUrl”仅在“name”字符串作为参数给定时执行。“getAttribute('name')”。我该怎么做?谢谢
@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(String)")
public void after1(JoinPoint jp){
System.out.println(jp.getArgs()[0]);
System.out.println("after Return:"+jp.getSignature());
}
以上方法可以奏效。如果希望支持除字符串以外的其他类型,请将字符串更改为所需的类型。jp.getArgs()[0]获取变量!
下面的方法你可以尝试,我尝试它成功地在我的代码
@AfterReturning(value = "execution(@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(a)")
public void after2(JoinPoint jp,String a){
System.out.println(a);
System.out.println("after Return:"+jp.getSignature());
}
以上方法可以奏效。如果希望支持除字符串以外的其他类型,请将字符串更改为所需的类型。jp.getArgs()[0]获取变量!
下面的方法你可以尝试,我尝试它成功地在我的代码
@AfterReturning(value = "execution(@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(a)")
public void after2(JoinPoint jp,String a){
System.out.println(a);
System.out.println("after Return:"+jp.getSignature());
}
你问的是不可能的。方法切入点表达式在基于签名和上下文区分要加入或排除哪些方法方面非常强大。参数本身的值不在该范围内
无论如何,我认为在代码中加入条件检查是有好处的。它更能抵抗重构带来的破坏,特别是当您将要检查的值设为常数时。您所要求的是不可能的。方法切入点表达式在基于签名和上下文区分要加入或排除哪些方法方面非常强大。参数本身的值不在该范围内
无论如何,我认为在代码中加入条件检查是有好处的。它更能抵抗重构带来的破坏,特别是当您将要检查的值设为常量时。以下是您的方面代码:
@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
public void fixUrl(JoinPoint p){
String name;
Object[] signatureArgs = p.getArgs();
if (signatureArgs.length > 0) {
Class baseRequestClass = signatureArgs[0].getClass();
try {
Method requestIdMethod = baseRequestClass.getMethod("name");
name = requestIdMethod.invoke(signatureArgs[0]) != null
? requestIdMethod.invoke(signatureArgs[0]).toString() : null;
if (name != null) {
System.out.println("Provided Name :" + name);
} else {
System.out.println("No Name parameter provided");
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
此处的名称具有提供的值。如果为null,则不提供。我添加了
日志,是否有名字有或没有
这是您的导入内容:
import org.aspectj.lang.JoinPoint;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ExecutionException;
这是您的方面代码:
@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
public void fixUrl(JoinPoint p){
String name;
Object[] signatureArgs = p.getArgs();
if (signatureArgs.length > 0) {
Class baseRequestClass = signatureArgs[0].getClass();
try {
Method requestIdMethod = baseRequestClass.getMethod("name");
name = requestIdMethod.invoke(signatureArgs[0]) != null
? requestIdMethod.invoke(signatureArgs[0]).toString() : null;
if (name != null) {
System.out.println("Provided Name :" + name);
} else {
System.out.println("No Name parameter provided");
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
此处的名称具有提供的值。如果为null,则不提供。我添加了
日志,是否有名字有或没有
这是您的导入内容:
import org.aspectj.lang.JoinPoint;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ExecutionException;
感谢您的回复,我正在寻找注释中的一些东西来提供方法值。我的意思是,我不想在方法体中使用if/else。方法将被执行,只有当这个特定的已通过。感谢您的答复,我正在寻找一些注释内给予方法值。我的意思是,我不想在方法体中使用if/else。方法将仅在已传递此特定值时执行。