我正在尝试使用Spring 2.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>
并用以下
替换了对javac编译器的引用 <iajc sourceroots="${src.home}"
destdir="${build.home}/WEB-INF/classes"
classpathRef="compile.classpath"
aspectPathRef="compile.classpath"
debug="${compile.debug}"
deprecation="${compile.deprecation}"
encoding="cp1252"
source="1.6"
target="1.6"
showWeaveInfo="${compile.debug}"/>
在applicationContext.xml中,我然后替换了
<context:load-time-weaver/>
带
<context:spring-configured/>
我的应用上下文文件BTW中的其他配置设置包括
<tx:annotation-driven/>
<context:component-scan base-package="com.domain.somepackage"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
在context.xml文件中,我从loader标记
中删除了以下内容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))
我从tomcat lib中删除了tomcatspringweaver jar。 我正在使用aspectj1.7
当我启动应用程序时,我收到一个错误,指示当dao类被注入服务类时,org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104)中有一个NPE < / p>
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
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;
}
...
}
由于所有这些都是最初设置的,所以这已经很长时间了,我不记得所有的配置是如何工作的。我也不太了解类加载器或AspectJ。但事情并没有正确发生,也许Entitymanager因某些原因没有被注入。
问题。
<context:spring-configured/>
吗? <context:component-scan base-package="com.domain.somepackage"/>
引用的包不包含相关的Dao类。当我添加另一个带有dao包的组件扫描标签时,没有任何不同的事情发生。这有必要吗?答案 0 :(得分:0)
您是否在某处定义了任何计划任务 - 听起来就像在Spring上下文完全初始化之前触发了计划任务。
答案 1 :(得分:0)
我终于在Spring顾问的帮助下找到了解决这个问题的方法。
在完全初始化之前,有一个方面被调用,导致方面的NPE。 (Eclipse错误地显示NPE源自正在被建议的类。)我通过删除注释禁用了方面,因为方面并不重要;但是,一个更好的解决方法是让我指示Spring在其他类之前初始化该类,或者使用更窄的点切割表达式并排除setter方法。