Spring中从加载时Weaver到编译时Weaver的转换问题

Spring中从加载时Weaver到编译时Weaver的转换问题,spring,dependency-injection,classloader,aspectj,compile-time-weaving,Spring,Dependency Injection,Classloader,Aspectj,Compile Time Weaving,我正试图用我的Spring2.5应用程序从加载时编织改为编译时编织 为此,我做了以下工作: 在我的ant构建文件中,我添加了 <path id="aspectPath"> <pathelement location="${lib.home}/spring-aspects.jar"/> </path> <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.propert

我正试图用我的Spring2.5应用程序从加载时编织改为编译时编织

为此,我做了以下工作:

  • 在我的ant构建文件中,我添加了

    <path id="aspectPath">
        <pathelement location="${lib.home}/spring-aspects.jar"/>
    </path>
    
    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
        <classpath>
            <pathelement location="${aspectj.home}/aspectjtools.jar"/>
        </classpath>
    </taskdef>
    
    当我运行构建脚本时,它编译时不会出错

    然而,我确实收到了这个警告

    [iajc] warning at <Unknown>::0 Found @DeclareAnnotation while current release 
    does not support it (see 'org.aspectj.weaver.bcel.AtAjAttributes') 
    
    大多数日志记录看起来像:

    [iajc] weaveinfo Join point 'method-execution(void com.kjconfigurator.upgra
    de.Upgrade1_07HelperImp.addServiceParticipation(com.kjconfigurator.core.domain.U
    ser, com.kjconfigurator.core.domain.ServiceAccount))' in Type 'com.kjconfigurato
    r.upgrade.Upgrade1_07HelperImp' (Upgrade1_07HelperImp.java:196) advised by after
    Returning advice from 'org.springframework.transaction.aspectj.AnnotationTransac
    tionAspect' (spring-aspects.jar!AbstractTransactionAspect.class:77(from Abstract
    TransactionAspect.aj))
    
    我从tomcat库中删除了tomcatspringweaver jar。 我使用的是aspectj1.7

    当我启动应用程序时,我得到一个错误,表明当一个dao类被注入服务类时,org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104)上有一个NPE

    Dao类扩展了一个AbstractJpaDao类,如下所示:

    public abstract class AbstractJpaDao<T>  {
        private static Logger log = Logger.getLogger(AbstractJpaDao.class.getName());
    
        private EntityManager entityManager;
    
        @PersistenceContext
        public void setEntityManager(EntityManager entityManager) {
            this. entityManager = entityManager;
        }
        ...
    }
    
    公共抽象类AbstractJpaDao{
    私有静态记录器log=Logger.getLogger(AbstractJpaDao.class.getName());
    私人实体管理者实体管理者;
    @持久上下文
    公共无效设置EntityManager(EntityManager EntityManager){
    this.entityManager=entityManager;
    }
    ...
    }
    
    这一切从最初建立到现在已经有很长时间了,我不记得所有的配置是如何工作的。我也不太了解类装入器或AspectJ。但是有些事情发生得不正确,可能是由于某种原因,Entitymanager没有被注入

    问题

  • 这可能是什么原因造成的
  • 确实需要
  • 引用的包不包括有问题的Dao类。当我添加另一个包含dao包的组件扫描标记时,并没有发生什么不同。这有必要吗

  • 您是否在某个地方定义了计划任务?听起来计划任务好像是在Spring上下文完全初始化之前触发的。

    在Spring顾问的帮助下,我终于找到了这个问题的解决方案


    有一个方面在完全初始化之前被调用,导致该方面出现NPE。(Eclipse错误地显示了源于所建议的类的NPE。)我通过删除注释禁用了方面,因为该方面不是关键的;然而,一个更好的解决方法是让Spring提前初始化那个类,或者使用一个更窄的切入点表达式,它排除了setter方法。

    您好,谢谢您的回答。所谓计划任务,是指连接到org.springframework.scheduling.quartz.SchedulerFactoryBean实例的触发器吗?我确实有一些,但是我禁用了它们,重新编译,并且在加载上下文时遇到了相同的问题。
    <tx:annotation-driven/>
    <context:component-scan base-package="com.domain.somepackage"/>
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    
    loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
    
    [iajc] warning at <Unknown>::0 Found @DeclareAnnotation while current release 
    does not support it (see 'org.aspectj.weaver.bcel.AtAjAttributes') 
    
    [iajc] warning at C:\server-
    lib\aspectjtools.jar!org\aspectj\ajdt\internal\compiler\
    CompilerAdapter.class:121::0 advice defined in    
    org.aspectj.ajdt.internal.compiler.CompilerAdapter has not been 
    applied [Xlint:adviceDidNotMatch]
    
    [iajc] weaveinfo Join point 'method-execution(void com.kjconfigurator.upgra
    de.Upgrade1_07HelperImp.addServiceParticipation(com.kjconfigurator.core.domain.U
    ser, com.kjconfigurator.core.domain.ServiceAccount))' in Type 'com.kjconfigurato
    r.upgrade.Upgrade1_07HelperImp' (Upgrade1_07HelperImp.java:196) advised by after
    Returning advice from 'org.springframework.transaction.aspectj.AnnotationTransac
    tionAspect' (spring-aspects.jar!AbstractTransactionAspect.class:77(from Abstract
    TransactionAspect.aj))
    
    Caused by: org.springframework.beans.PropertyBatchUpdateException; nested
    PropertyAccessExceptions (1) are: PropertyAccessException 1: 
    org.springframework.beans.MethodInvocationException: Property 'dao' threw exception; 
    nested exception is java.lang.NullPointerException
    
    public abstract class AbstractJpaDao<T>  {
        private static Logger log = Logger.getLogger(AbstractJpaDao.class.getName());
    
        private EntityManager entityManager;
    
        @PersistenceContext
        public void setEntityManager(EntityManager entityManager) {
            this. entityManager = entityManager;
        }
        ...
    }