2011-07-12 27 views
7

Chúng tôi đã sử dụng aspectJ để lấy số liệu trên một ứng dụng hiện có. Khi xây dựng và dệt với AJDT trong nhật thực, mọi thứ đều hoạt động tốt. Nhưng trong env tích hợp. chúng tôi sử dụng một kịch bản kiến ​​để xây dựng và triển khai ứng dụng.NoSuchMethodError aspectOf() tại thời gian chạy từ khi xây dựng với iajc

Vấn đề xảy ra trên một ExceptionHandler tôi đã làm để chắc chắn khía cạnh của chúng tôi sẽ không ném ngoại lệ và phá vỡ các ứng dụng

@Aspect 
public class ExceptionHandlerAspect { 

    /** 
    * Pointcut 
    */ 
    @Pointcut("within(com.xxx.yyy.aop.aspect.*..*)") 
    public void allMethodInAspectPackage() {} 

    /** 
    * Pointcut 
    */ 
    @Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)") 
    public void notInExceptionHandlerAspectClass() {} 
    /** 
    * Pointcut 
    */ 
    @Pointcut("call(* *(..))") 
    public void allClassAndMethod() {} 

    /** 
    @Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()") 
    public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{ 
     Object ret = null; 
     try { 
      ret = joinPoint.proceed(); 
     }catch (Throwable exception) { 
      if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) { 
       throw exception; 
      } 
      this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception); 
     }finally { 
      return ret; 
     } 

    } 

} 

về cơ bản, tôi muốn để đánh chặn mọi cuộc gọi trong phạm vi gói khía cạnh của tôi ngoại trừ trong ExceptionHandler riêng của mình.

các kiến ​​xây dựng cái nhìn như thế này:

<iajc inpath="${classes.dir}" destDir="${classes.dir}" fork="true" maxmem="${aspectj.maxmem}" verbose="true" showWeaveInfo="true" debug="true"> 
    <classpath refid="ajclasspath"/> 
</iajc> 

Các $ {} classes.dir là thư mục lớp học nơi nhiệm vụ javac xây dựng các ứng dụng và các khía cạnh

Từ kết quả,

Exception in thread "main" java.lang.NoSuchMethodError: com.xxx.yyy.aop.aspect.ExceptionHandlerAspect.aspectOf()Lcom/xxx/yyy/aop/aspect/ExceptionHandlerAspect; 
    at com.xxx.yyy.aop.aspect.ecs.AspectBaseEcs.inspectLoginInfo(AspectBaseEcs.java:65) 
    at com.xxx.yyy.app.es.security.Security.loadApplications(Security.java:172) 
    at com.xxx.yyy.app.es.gui.VSDlgLogin.loadSecurity(VSDlgLogin.java:346) 
    at com.xx.yyy.app.es.ApplicationSuite.start(ApplicationSuite.java:839) 
    at com.xxx.yyy.app.es.ApplicationSuite.main(ApplicationSuite.java:501) 

có vẻ như ExceptionHandler không được dệt !!!

Tôi hy vọng ai đó có thể giúp tôi về điều này ;-)

+0

Có nguyên nhân phổ biến hơn của lỗi này [ở đây] (http://stackoverflow.com/questions/12929716/why-server-complaining-about-aspectof-is-missing) –

Trả lời

5

Cuối cùng đã tìm thấy sự cố. Ứng dụng của chúng tôi đã có sự phụ thuộc vào lọ mô-đun chung có chứa khía cạnh quá.

Tên gói cơ sở giống nhau: com.xxx.aop và lớp cơ sở chúng tôi sử dụng cho các khía cạnh của chúng tôi là cùng tên. Vì vậy, 2 com.xxx.aop.AspectBase.class đã được tải.

Vì chúng tôi đã sử dụng cờ trong tệp xây dựng Ant của chúng tôi để cho phép dệt thời gian biên dịch tại có/không, một trong số AspectBase.class của chúng tôi không được dệt trong khi khác.

0

có vẻ như bạn đã quên khai báo đường dẫn khía cạnh. Tất cả nhiệm vụ của bạn là biên dịch nhưng không dệt. Và đó là kết quả trong java.lang.NoSuchMethodError

Dưới đây là một ví dụ cho thấy làm thế nào để sử dụng nhiệm vụ iajc với dệt:

<iajc outjar="demo.jar"> 
    <sourceroots> 
     <pathelement location=”src” /> 
     <pathelement location=".." /> 
    </sourceroots> 
    <aspectpath> 
     <pathelement location="org.springframework.aspects-3.0.0.RC1.jar" /> 
    </aspectpath> 
</iajc> 

Tôi hy vọng điều này sẽ giúp!

+0

Cảm ơn bạn đã trả lời. Trên thực tế, tôi có thể thấy rằng các khía cạnh của tôi được dệt. Kể từ khi tôi dịch ngược chúng, tôi thấy rằng aspectOf() và hasAspect() được hiển thị trong mã được giải mã của ExceptionHandler của tôi. Tất cả các khía cạnh này đều nằm trong một gói bên trong dự án. Tất cả đều được bao gồm trong inpath. Chúng ta có gì để đặt vào đường cảm ứng? aspecjrt.jar? – Cygnusx1

+0

Khía cạnh bạn muốn dệt vào mã của mình.Trong ví dụ trên có chứa một khía cạnh giao dịch để dệt logic giao dịch cho tất cả các phương thức được đánh dấu bằng @Transactional. Nếu bạn có khía cạnh của bạn trong inpath, nó cũng sẽ làm việc. – Espen

+0

Cảm ơn bạn một lần nữa để dành thời gian trả lời. Trên thực tế bạn trả lời một câu hỏi khác tôi đã đăng về aspectpath ;-) Nhưng không may là nó vẫn không hoạt động. Các khía cạnh của tôi có chứa trong cùng một dự án như mã cơ sở của ứng dụng. vì vậy họ đang trong thực tế trong inpath. nhưng vẫn không có may mắn với ExceptionHandler có một NoSuchMethodError khi chạy. Nếu tôi nhận xét các phím tắt của ExceptionHandler, mọi thứ sẽ hoạt động tốt. Vì vậy, ExceptionHandler là nguyên nhân ... nhưng tại sao^tôi vẫn không biết :-( – Cygnusx1

0

Tôi có vấn đề rất giống

java.lang.NoSuchMethodError: ....aspectOf()... 

Tôi đang sử dụng Spring 3.1.2 + Maven 3.0.4 + Tomcat 7.0.29 và vào những thời điểm od nó sẽ xảy ra khi tôi bắt đầu Tomcat Tôi nhận ngoại lệ này.

Tôi không biết tại sao điều đó lại xảy ra. Tôi đang sử dụng Spring Tool Suit IDE, nhưng khi tôi thực hiện mvn clean install từ dòng lệnh (không phải trong IDE), bằng cách nào đó nó được sửa chữa, có thể điều này sẽ giúp một người nào đó.

Các vấn đề liên quan