2012-03-15 28 views
5

Tôi nhận được lỗi này trong webapp mùa xuân của tôi (mùa xuân 3.1), và tôi không biết tại sao.NoClassDefFoundError với bộ nhớ đệm mùa xuân và aspectj

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: mypackage/TestCache$AjcClosure1

(các $AjcClosure1 là lạ)

Nếu tôi nhận xét các chú thích @Cacheable trong lớp dưới lỗi đã biến mất.

public class TestCache { 

     @Cacheable(value ="myCache") 
     public List<String> getDummyList(){ 
      Logger l = Logger.getLogger(this.getClass()); 
      l.error("calling getDummyList"); 
      ArrayList<String> foo = new ArrayList<String>(); 
      foo.add("foo"); 
      foo.add("bar"); 
      return foo; 
     } 

    } 

Lớp học của tôi điều khiển (giản thể):

@Controller 
@RequestMapping("/mypage") 
public class MyController { 


    @RequestMapping 
    public String index(ModelMap model, Locale locale) { 
     TestCache tc = new TestCache(); 
     ... 
    } 
} 

Application Context (chỉ bộ nhớ cache một phần):

<cache:annotation-driven mode="aspectj"/> 
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/> 
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="classpath:ehcache.xml"/> 

tôi đã cố gắng proxy và chế độ AspectJ (trong chế độ proxy ít lỗi nhưng bộ nhớ cache không hoạt động)

Ứng dụng web này được xây dựng ban đầu bằng roo và sử dụng mv mùa xuân c và luồng web. Vì vậy, có khá nhiều xml trong applicationContext.xml hoặc webmvc-config.xml (và tôi không thể hiểu những gì một số bean đang làm). Tôi đang chạy các wepapps trong nhật thực với m2e-wtp và tệp pom.xml đang sử dụng plug-in plugin-maven-plugin (nhưng không biết nó làm gì)

Dường như vấn đề có liên quan với aspectj, nhưng tôi không bao giờ sử dụng aspectJ. Nếu ai đó spring/java/aspectj guru có thể giải thích cho tôi điều gì gây ra lỗi này và cách tôi có thể làm cho bộ nhớ cache của tôi hoạt động, nó sẽ thật tuyệt vời! (Tôi chỉ có thể tìm thấy hướng dẫn nhưng không có dự án mẫu nào sử dụng chú thích có thể lưu vào bộ nhớ cache).

+0

Làm mới thư mục đích, xem http://stackoverflow.com/questions/16283268/how-to-deploy-generated-resources-to-tomcat-with-m2e-wtp – xmedeko

Trả lời

0

Một vấn đề (có thể không phải là nguyên nhân gây ra NoClassDefFoundError) là bạn có thể sử dụng các hàm Spring như chỉ @Cacheable cho Spring Bean. Vì vậy, nếu bạn tạo một lớp học thông qua new (và lớp này nó không được chú thích bởi @Configurable) thì đây là một lớp bình thường chứ không phải là một bean Spring. Do đó chú thích bị bỏ qua trong chế độ proxy. - Có thể điều này cũng sẽ dẫn đến lỗi stange này trong chế độ AspectJ, nhưng tôi không biết.

+0

Cảm ơn điều này đang giúp tôi một chút, tôi bắt đầu hiểu rõ hơn cách hoạt động của nó! nhưng tôi đã tạo một giao diện và khai báo một bean trong ngữ cảnh ứng dụng, và autowire nó trong bộ điều khiển với cùng một lỗi. Tôi sẽ xem xét thẻ @configurable – jpprade

+1

Ok Tôi nghĩ rằng tôi thấy vấn đề xuất phát từ nhật thực hoặc wtp pluggin, Nếu tôi Kiểm tra đường dẫn đích dưới nhật thực có một myclass biên dịch $ AjcClosure1 nhưng nếu tôi tìm trong tệp tomcat này không được xuất bản – jpprade

3

Có vẻ như vấn đề xuất phát từ thực tế là tất cả lớp học $ AjcClosure [n] .class không được xuất bản và cách duy nhất để làm là xóa, webapps, bắt đầu sạch và xuất bản lại ứng dụng web.

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