Я пытаюсь использовать byte Buddy с большим приложением. Сейчас я хочу просто вывести что-то из метода ввода/вывода с помощью @Advice. Мой агент правильно прикрепляется к приложению и строится. В журналах я также вижу, что преобразование указанного класса также выполняется. Проблема в том, что когда я отправляю запрос на нужную RestEndpoint и вызывается метод, я получаю сообщение об ошибке:
javax.servlet.ServletException: A MultiException has 1 exceptions. They are:
1. java.lang.NoClassDefFoundError: com/agent/MyAdviser
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:391)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
Мой агент:
LOG.info("Before Agent Builder build !!!");
new AgentBuilder.Default()
.with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
.type(is(MyClassToCatch.class))
.transform(
new AgentBuilder.Transformer.ForAdvice()
.include(MyAgent.class.getClassLoader())
.advice(ElementMatchers.any(), MyAdviser.class.getName())
)
.installOn(inst);
И MyAdviser.class:
public class MyAdviser {
private static final Logger LOG = LoggerFactory.getLogger(MyAdviser.class);
@Advice.OnMethodEnter
public static void onEnterExit() {
LOG.info("INTERCEPTED BBB <<<>>> BBB");
}
Проблема как-то связана с загрузчиком классов? БР,
Решение Рафаэля помогло.
EDIT: я также пытался перехватить метод и просто вызвать его без каких-либо изменений, но я закончил с такой ошибкой:
com.agent.DiscoveryAgent - On Error of : MyClassToCatch None of [net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@7815f1c, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@a193f70f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@d6fdc355, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@66e2275b, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@19cb065f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@4fc13971, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@aea74e0e, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@2ac04890, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@f5eef57c, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@e1b04a0f, net.bytebuddy.implementation.bind.annotation.TargetMethodAnnotationDrivenBinder$Record@f0de1c86] allows for delegation from public javax.ws.rs.core.Response MyClassToCatch.someMethod()