1

我正在尝试使用我的 Spring 2.5 应用程序从加载时编织更改为编译时编织。

为此,我执行了以下操作:

  1. 在我的 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 库中删除了 tomcatspringweaver jar。我正在使用aspectj1.7

当我启动应用程序时,我收到一条错误消息,表明当将 dao 类注入服务类时,在 org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104) 处存在 NPE

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 由于某种原因没有被注入。

问题。

  1. 这可能是什么原因造成的?
  2. 真的<context:spring-configured/>需要吗?
  3. 引用的包<context:component-scan base-package="com.domain.somepackage"/>不包括有问题的 Dao 类。当我添加另一个带有 dao 包的组件扫描标签时,没有什么不同。这是必要的吗?
4

2 回答 2

0

您是否在某处定义了任何计划任务 - 听起来计划任务在 Spring 上下文完全初始化之前被触发。

于 2012-10-12T17:41:33.557 回答
0

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

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

于 2012-11-05T06:57:53.033 回答