2017-03-01 7 views
1

더 큰 응용 프로그램과 바이트 버디를 사용하려고합니다. 지금 당장은 @Advice를 사용하여 enter/exit 메쏘드에 무엇인가를 로그 아웃하는 것이다. 내 상담원이 애플리케이션에 올바르게 연결되어 구축되었습니다. 로그에서 나는 지적 클래스의 변형이 또한 수행되었음을 볼 수 있습니다.바이트 친구와 함께 클래스를 찾을 수 없습니다 예외 Java 에이전트

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"); 
} 

인가 내가 RestEndpoint와 메서드를 호출하여 필요에 요청을 보내고있을 때 문제는 오류가있다 어떻게 든 클래스 로더에 연결된 문제는 무엇입니까? BR,

라파엘의 솔루션이 도움이되었습니다.

편집 : 나는 방법을 가로 채기도했는데, 단지 변경없이 전화를하지만이 같은 오류와 함께 종료되었습니다했습니다

com.agent.DiscoveryAgent - On Error of : MyClassToCatch  None of [net.bytebuddy.implement[email protected]7815f1c, net.bytebuddy.implement[email protected]a193f70f, net.bytebuddy.implement[email protected]d6fdc355, net.bytebuddy.implement[email protected]66e2275b, net.bytebuddy.implement[email protected]19cb065f, net.bytebuddy.implement[email protected]4fc13971, net.bytebuddy.implement[email protected]aea74e0e, net.bytebuddy.implement[email protected]2ac04890, net.bytebuddy.implement[email protected]f5eef57c, net.bytebuddy.implement[email protected]e1b04a0f, net.bytebuddy.implement[email protected]f0de1c86] allows for delegation from public javax.ws.rs.core.Response MyClassToCatch.someMethod() 

답변

0

조언 클래스의 코드 대상 클래스에 복사됩니다. 즉, MyAdviser 클래스를 해결할 수 있어야합니다.

  1. defineField를 통해 변환 된 클래스의 필드와 @FieldValue 주석으로 Logger 정의 : 이것이 가능하지 않다면, 당신은해야합니다.
  2. 조언 내에서 로거를 동적으로 읽고 로그 루트로 표시되는 다른 클래스를 참조하십시오.
+0

안녕하세요 Rafael! 도와 줘서 고마워, 드디어 해냈고 예상대로 로그 아웃했다. – Macko