[← Broken aspect gallery](05-broken-aspect-gallery.md) · [Index](../README.md) # 6. Diagnosing a silent aspect Endpoint: [`AopDiagnosticsEndpoint`](../src/main/java/com/ankurm/aop/web/AopDiagnosticsEndpoint.java). Almost every non-firing aspect is one of three things, and all three are visible in one place. ## The three questions, in order **1. Is the bean proxied at all?** ```java AopUtils.isAopProxy(bean) ``` `false` means no pointcut matched this bean, or it is not a bean. Stop here and check the pointcut and the registration. **2. Which kind of proxy?** ```java AopUtils.isJdkDynamicProxy(bean) // interfaces only AopUtils.isCglibProxy(bean) // subclass ``` If it is a JDK proxy and your method is not on an interface, that is your answer. **3. Is your advice in the advisor list?** ```java if (bean instanceof Advised advised) { Arrays.stream(advised.getAdvisors()) .map(a -> a.getAdvice().getClass().getSimpleName()) .forEach(System.out::println); } ``` Proxied, right kind, and your advice missing means the pointcut matched the *bean* but not the *method*. ## Output ``` defaultOrderService CGLIB subclass target=DefaultOrderService class : DefaultOrderService$$SpringCGLIB$$0 interfaces : (none) advisors : 11 ``` ## Testing a pointcut without an application The fastest check of all, and it belongs in a test rather than in a diagnostic endpoint: ```java AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); pointcut.setExpression("execution(* com.example.service.*.*(..))"); assertThat(pointcut.matches(Foo.class.getMethod("bar"), Foo.class)).isTrue(); ``` Remember that `setExpression` does not parse; the parse happens on first `matches`. So this is also how you find out that a designator is unsupported before production does. ## Logging ``` logging.level.org.springframework.aop=DEBUG ``` reports proxy creation per bean. Verbose, but it answers question 1 for every bean at once. ## Delete the endpoint before shipping It reports internal wiring. If you want it permanently, put it behind the management port and authentication.