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

私のアプリ コンテキスト ファイル、ところで、その他の構成設定には、次のものが含まれます。

<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 があることを示すエラーが表示されます。

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 のパッケージを含む別の component-scan タグを追加しても、何も変わりません。これは必要ですか?
4

2 に答える 2

0

Spring コンサルタントの助けを借りて、この問題の解決策を最終的に見つけました。

完全に初期化される前に呼び出されたアスペクトがあり、そのアスペクトで NPE が発生しました。(Eclipse は、アドバイスされていたクラスに由来する NPE を誤って表示しました。) アスペクトは重要ではなかったため、注釈を削除してアスペクトを無効にしました。ただし、Spring に他のクラスよりも先にそのクラスを初期化するように指示するか、より限定的でセッター メソッドを除外するポイント カット式を使用することをお勧めします。

于 2012-11-05T06:57:53.033 に答える
0

どこかで定義されたスケジュール タスクはありますか。Spring コンテキストが完全に初期化される前に、スケジュールされたタスクがトリガーされているようです。

于 2012-10-12T17:41:33.557 に答える