2012-03-15 4 views
5

스프링 webapp (spring 3.1)에서이 오류가 발생하며 이유를 알지 못합니다. 오류가 사라 아래 I 클래스에 주석 @Cacheable을 언급하는 경우스프링 캐시 및 aspectj가있는 NoClassDefFoundError

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

합니다 ($AjcClosure1 이상한입니다).

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

    } 

내 컨트롤러 클래스 (간체) :

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


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

응용 프로그램 컨텍스트 (전용 캐시 부분) :

<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"/> 

나는 프록시 모드 에러가 덜하지만에 프록시와 AspectJ의 모드 (시도 캐시가 아무 것도하지 않음)

이 웹 응용 프로그램은 처음에는 roo로 만들어졌으며 mv c와 웹 플로우. 따라서 applicationContext.xml 또는 webmvc-config.xml에는 꽤 많은 xml이 있습니다 (일부 콩이 무엇을하는지 이해할 수 없습니다). 내가 m2e-WTP와 일식의 wepapps를 실행하고하고 pom.xml 파일은 플러그인 AspectJ를-받는다는 - 플러그인을 사용하고 있습니다 (그러나 그것은 무엇을 어떤 아이디어)

문제가 AspectJ의와 관련이 마치

, 하지만 aspectJ는 사용하지 않았습니다. spring/java/aspectj 전문가가이 오류를 만드는 이유와 캐시를 작동시키는 방법을 설명 할 수 있다면 정말 멋져요! (튜토리얼 만 있지만 캐시 가능한 주석을 사용하는 샘플 프로젝트는 찾을 수 없다).

+0

나는 http://stackoverflow.com/questions/16283268/how-to-deploy-generated-resources-to-tomcat-with-m2e-wtp이 나에게 조금 도움이됩니다 – xmedeko

답변

0

하나의 문제점 (NoClassDefFoundError가 발생하지 않는 문제)은 Spring Beans에만 @Cacheable과 같은 스프링 함수를 사용할 수 있다는 것입니다. 따라서 new을 통해 클래스를 만들면 (이 클래스는 @Configurable으로 주석 처리되지 않습니다) 다음은 일반 클래스이며 Spring 빈이 아닙니다. 따라서 프록시 모드에서는 주석이 무시됩니다. - 이것이 AspectJ 모드에서의 stange 에러가 될 수도 있지만 모르겠습니다.

+0

감사를 참조 대상 폴더를 새로 고침 어떻게 작동하는지 더 잘 이해하기 시작하십시오! 하지만 인터페이스를 만들고 응용 프로그램 컨텍스트에서 bean을 선언하고 같은 오류로 컨트롤러에서 autowire합니다. @configurable 태그를 보겠습니다. – jpprade

+1

좋아요. 이클립스 또는 wtp 플러그인에서 문제가 발생했다고 생각합니다. 일식에서 대상 경로를 확인하면 컴파일 된 myclass $ AjcClosure1이 있지만이 파일이 게시되지 않은 경우 – jpprade

3

모든 클래스 $ AjcClosure [n] .class가 게시되지 않았으며이를 수행하는 유일한 방법은 제거, webapps, 정리 시작 및 webapp 재발행입니다.