0

編集7:

問題は、 を操作する方法にあるようです@ConfigurableHttpSessionListener回避策が提案されていますが、WebApplicationContext直接操作するのは避けたいと思います。

   @Configurable(autowire = Autowire.BY_TYPE, preConstruction = true)
    public class SessionListener implements HttpSessionListener {

        private static final Logger log;

        @Autowired
        private A a;

        @Override
        public void sessionCreated(HttpSessionEvent se) {
            a.doSomething(); // <- Throws NPE
            log.info("New session was created");
        }

        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            log.info("A session was closed");
        }
    }

編集6:

サンプル プロジェクトをよりシンプルにしました。CLI から実行できるようになりました。

  1. プロジェクトのダウンロードと抽出: http://www.2shared.com/file/KpS5xeqf/dynatable.html
  2. mvn cleanspectj:compile を実行します
  3. 実行 mvn gwt:run
  4. CLI で「Why is consumer NULL here?」と表示されるはずです。印刷されます。
  5. 代わりに期待されるのは: cunsumer は NULL ではありません!

終わりが近い :D

編集 5: GWT のサンプル プロジェクト: GWT 開発モードでこれを実行してください

http://www.2shared.com/file/eai0PV-5/dynatable.html

sessionCreated() で NPE を取得します。

実行するための要件はmaven + gwt 2.5です

編集4:

サンプル プロジェクトはあまり代表的なものではないようでした。問題を再定式化する必要があります。

Eclipse では、プロジェクトを Web アプリケーションとして実行するときに GWT 開発モードを使用します。これは何らかの方法で、aspectj コンパイラを呼び出しません。少なくともそれが私が考えることができる唯一の理由です。

質問: Web アプリケーション (GWT 開発モード) として動作するように Compile Time Weaving をセットアップするには?

編集3:

問題を示すEclipse 4.2.1、M2e 1.4.0、STS 3.1.0、AJDT 2.2.2で小さなサンプルプロジェクトを作成しました:http://www.2shared.com/file/WZ1T9l9-/autowired.html

編集2:

他の同様のトピックで示唆されているように、Rooバージョンの競合を避けるために、標準生成プロジェクトのプラグインを使用しました。まだ成功していません。(上記の org.codehaus.mojo を更新)

編集1:

これが正常かどうかはわかりませんが、Web アプリケーションを起動すると、Spring が行っていることの長いログが表示されますが、ウィービングや Aspectj に関連するものについては何も言及されていません...

問題は、コンソールでフィードバックが得られないため、pom.xml のこのプラグインがコンパイルされていないことに関連していると思います(他の多くの同様のプラグインを試しましたが、どれも機能しませんでした)応用:

<plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>aspectj-maven-plugin</artifactId>
                    <version>1.2</version>
                    <!-- NB: do not use 1.3 or 1.3.x due to MASPECTJ-90 and do not use 1.4 
                        due to declare parents issue -->
                    <dependencies>
                        <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see 
                            MNG-2972) -->
                        <dependency>
                            <groupId>org.aspectj</groupId>
                            <artifactId>aspectjrt</artifactId>
                            <version>1.7.0</version>
                        </dependency>
                        <dependency>
                            <groupId>org.aspectj</groupId>
                            <artifactId>aspectjtools</artifactId>
                            <version>1.7.0</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>test-compile</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <outxml>true</outxml>
                        <aspectLibraries>
                            <aspectLibrary>
                                <groupId>org.springframework</groupId>
                                <artifactId>spring-aspects</artifactId>
                            </aspectLibrary>
                        </aspectLibraries>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

元の投稿:

私はstackoverflowや他の多くのリソースを検索してきましたが、それらの標準的な解決策のどれも、アクセス時に@autowiredフィールドが降伏する理由を見つけるのに役立ちません.Null Pointer Exception (NPE)

@Configurable(autowire = Autowire.BY_TYPE, preConstruction = true)
public class SessionListener implements HttpSessionListener {

    private static final Logger log;

    @Autowired
    private A a;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        a.doSomething(); // <- Throws NPE
        log.info("New session was created");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        log.info("A session was closed");
    }
}

A クラスは次のように宣言されます。

@Service
public class B implements A {
// some implementation
}

私のアプリケーションコンテキストには関連する部分があります:

<context:spring-configured />
<context:annotation-config />
<context:component-scan base-package='some.package' />

必要なライブラリはすべてそこにあります。私はSpring 3.0.2を使用しています。私の環境のせいで、コンパイル時ウィービングしか使えません。また、Google プラグインを使用して GWT 開発モードを開始しています。ADJTSpring Tool Suitem2Eclipseおよびを使用していGoogle Pluginます。m2e v1.0 用の AJDT コンフィギュレーターもインストールしました。

4

1 に答える 1

1

App.main()メソッドは最初からApplicationContextを作成しません(@ContextConfigurationで注釈が付けられているため、JUnitテストは問題ありません)。プログラムで作成するには、メインメソッドに次の行を追加します。

public class App {      
    public static void main( String[] args ) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("foo/application-context.xml");

        new ServiceTest().doSomething();
    }
}

編集1:以下の静的ソリューション。

欠落している2つの依存関係があります:

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-aspects</artifactId>
  <version>${org.springframework.version}</version>
</dependency>
<!-- https://jira.springsource.org/browse/SPR-6819 -->
<dependency>
  <groupId>javax.persistence</groupId>
  <artifactId>persistence-api</artifactId>
  <version>1.0</version>
  <scope>provided</scope>
</dependency>

また、 ajdtBuildDefFileプラグインパラメーター(ファイルはアーカイブに含まれていませんでした)を次のように置き換えました。

<includes>
  <include>**/*.java</include>
</includes>

そのようにpom.xmlを調整した後、コンパイルとテストは次のように合格します。

mvn clean aspectj:compile test

編集1:このソリューションは動的織りに関連していますが、そうではありません。

特定の質問に答えるには、これをapplication-context.xmlに追加します。

<context:load-time-weaver />

VMの追加のランタイム引数も必要になります。

-javaagent:/full/path/to/spring-instrument-3.0.5.RELEASE.jar

EDIT2:GWTアプリに関連して

率直に言って、aspectjプラグインが構成で機能しない理由はわかりません。簡単な回避策を気にしない場合は、WebApplicationContextUtilsを使用してください。

@Override
public void sessionCreated(HttpSessionEvent se) {       
  consumer = WebApplicationContextUtils.getWebApplicationContext(se.getSession().getServletContext()).getBean(IConsumer.class);
  ...
}
于 2013-02-26T18:23:33.307 に答える