У меня есть аннотация:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Retry {
int DEFAULT_RETRIES = 2;
int times() default DEFAULT_RETRIES;
}
, которая используется либо на уровне класса:
@Retry(times = 5)
public class PersonServiceClass {
//...
public void deletePerson(long id) {
//...
}
}
, либо на уровне метода (другой класс, не PersonServiceClass):
@Retry
public void deletePerson(long id) {
//...
}
Аспект улавливается таким классом:
@Aspect
@Component
public class RetryInterceptor {
@Around("@within(retry) || @annotation(retry)")
public Object around(ProceedingJoinPoint proceedingJoinPoint, Retry retry) throws Throwable {
System.out.println("around - " + retry);
System.out.println("joinpoint - " + proceedingJoinPoint);
return aroundHandler(proceedingJoinPoint, retry);
}
А аспект корректно улавливается на уровне метода или класса, но что-то не так с привязкой Retry
аннотация.
Когда@Around
выглядит следующим образом: @Around("@within(retry) || @annotation(retry)")
затем:
- Когда пойман на уровне метода, чем
retry
является связанным - Когда пойман на уровне класса, чем
retry
is null .
Когда @Around
выглядит следующим образом @Around("@annotation(retry) || @within(retry)")
, тогда:
- При получении на уровне метода, отличном от
retry
is null . - При обнаружении на уровне класса
retry
is переплет .
Родительская версия Spring Boot- 2.1.1. РЕЛИЗ