Spring中从加载时Weaver到编译时Weaver的转换问题
我正试图用我的Spring2.5应用程序从加载时编织改为编译时编织 为此,我做了以下工作: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
<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;
}
...
}