Как сопоставить аннотацию метода ИЛИ типа только один раз - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу иметь перехватчик 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() {}
}

Перехватчик вызывается дважды, что плохо!

Есть ли способ избежать повторного запуска перехватчика, но с таким же поведением?

1 Ответ

0 голосов
/ 22 ноября 2018

Этого можно добиться, сделав свои связующие взаимоисключающими, например:

// 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());
...