我有一个切入点,我试图用LTW。我有两种方法可供建议,每种方法都有不同的参数列表。但是,它们都有一个我想要的通用参数。
这些是我想建议的方法签名:
public static WorkflowModifierFlags authenticateUser(String username, String password, String ip, boolean webGUI, boolean realAuthentication)
public static boolean loginJAAS(HttpServletRequest request, HttpServletResponse response, String username, String password, HttpSession session)
我尝试了以下切入点/建议,但它失败了; username变量有时会被注入IP地址(即:第一个切入点的args())。
@Before("(execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)) || "
+ "(execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..))" )
public void setUsername(JoinPoint jp, String username) {
// inject the username into the MDC
MDCUtils.setUsername(username);
}
我原本希望args()
参数与execution()方法相关联,但有时会出现“混乱”,并给我IP而不是用户名。
我是否错误地使用了AspectJ,或者这是LTW中的错误?我正在运行AspectJ 1.6.13
答案 0 :(得分:1)
AspectJ 1.8.9具有相同的行为。对此的一个解决方案/解决方法是使用针对每种情况的不同切入点将建议拆分为两个,然后使用用户名委托您要执行的逻辑以避免代码重复。它看起来与此类似:
@Before("execution(public static * business.security.service.LoginManagerHelper.authenticateUser(..)) && args( username, ..)")
public void pointcut1(String username) {
doSomethingWithUsername(username);
}
@Before("execution(public static * webapp.util.LoginManagerAction.loginJAAS(..)) && args( *, *, username, ..)")
public void pointcut2(String username) {
doSomethingWithUsername(username);
}
private void doSomethingWithUsername(String username) {
// inject the username into the MDC
MDCUtils.setUsername(username);
}
我总是根据OR-ed切入点使用类似于每个用例的绑定(即最初与||
结合的切入点表达式)来拆分建议,因为使用@annotation()
类型切入点会导致错误有关不一致绑定的消息。请参阅我关于这些案例的其他两个答案以及类似的解决方案,以便将常用功能提取到单独的方法:answer 1,answer 2。
我相信AspectJ应该在你的情况下表现出与@annotation()
类型切入点相同的行为,所以我认为编译器不报告错误并做出意想不到的事情是AspectJ编译器本身的一个错误。