首页 > 解决方案 > 如何仅在类型或方法注释上匹配一次

问题描述

我想要一个 Guice 拦截器来拦截对带注释的类或带注释的方法的调用。我希望能够将两者结合起来,即。使用具有不同属性的方法注释覆盖类注释。

我有这样的工作:

// Intercept all METHODS annotated with @MyAnnotation
bindInterceptor(
    Matchers.any(),
    Matchers.annotatedWith(company.MyAnnotation),
    new TracingInterceptor());

// Intercept all methods in CLASSES annotated with @MyAnnotation
bindInterceptor(
    Matchers.annotatedWith(company.MyAnnotation),
    Matchers.any(),
    new TracingInterceptor());

但是,当我这样注释类时:

@MyAnnotation    
class MyClass {
    @MyAnnotation
    public void myMethod() {}
}

拦截器被调用两次,这很糟糕!

有什么方法可以避免触发拦截器两次,但行为相同?

标签: aopguiceinterceptor

解决方案


您可以通过使活页夹互斥来实现这一点,如下所示:

// Intercept all METHODS annotated with @MyAnnotation in classes not annotated with @MyAnnotation
bindInterceptor(
    Matchers.not(Matchers.annotatedWith(company.MyAnnotation)),
    Matchers.annotatedWith(company.MyAnnotation),
    new TracingInterceptor());

// Intercept all methods not annotated with @MyAnnotation in CLASSES annotated with @MyAnnotation
bindInterceptor(
    Matchers.annotatedWith(company.MyAnnotation),
    Matchers.not(Matchers.annotatedWith(company.MyAnnotation)),
    new TracingInterceptor());

// Intercept all METHODS not annotated with @MyAnnotation in CLASSES annotated with @MyAnnotation
bindInterceptor(
    Matchers.annotatedWith(company.MyAnnotation),
    Matchers.annotatedWith(company.MyAnnotation),
    new TracingInterceptor());

推荐阅读