当前位置: 首页 > 知识库问答 >
问题:

AspectJ切入点匹配参数(args())匹配不正确

林亦
2023-03-14

我有一个切入点,我试图用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)
@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中的一个bug?我运行的是AspectJ 1.6.13

共有1个答案

章飞章
2023-03-14

AspectJ1.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);
}

我总是使用类似于每个用例的绑定(即最初与)组合的切入点表达式)来根据或-ed切入点拆分建议,因为对于@annotation()类型切入点,它会导致一个关于不一致绑定的错误消息。请参阅我关于这些情况的另外两个答案,以及将通用功能提取到单独方法的类似解决方案:答案1和答案2。

我认为AspectJ在您的情况下应该表现出与@annotation()类型切入点相同的行为,因此我认为编译器不报告错误并执行意外操作是AspectJ编译器本身的一个bug。

 类似资料:
  • 我试图围绕使用自定义注释注释的方法定义一个切入点。注释有一个参数,我想在切入点定义中包含一个检查。 这是注释: 如何应用注释的示例: 现在我想有两个切入点定义,根据注释的内容选择这两种方法。 在注释本身上创建切入点相对容易: 这将匹配@MyAnno的每次出现。但是我如何定义两个切入点,一个将与包含的匹配,另一个将与包含的匹配

  • 假设我有一个注释,如下所示: 然后在Aspect中,我怎么可能想写两个切入点,一个用于所有用@DB操作(isRead操作=true)注释的方法,一个用于@DB操作(isRead操作=false)?

  • 我想使用ElementType运行一个方面。参数注释,但它不起作用。从不调用about-tokenize方法。

  • 到目前为止,我已经尝试了以下表达式,但没有成功: 有人能给我指出正确的解决办法吗?有可能吗?

  • 问题内容: 如果满足以下条件,则需要创建一个与方法匹配的切入点的方面: 它用MyAnnotationForMethod注释 它的参数之一(可以有多个)用@MyAnnotationForParam注释(但也可以具有其他注释)。 方面类看起来像这样 注释方法 随着日食->警告:在poincut: 使用http://download.eclipse.org/tools/ajdt/35/update中的最