6

Spring 3.1 を使用して Google App Engine アプリを構築していますが、接続された jar の 1 つでメンバーを取得する際に問題が発生しています。

私は3つのプロジェクトを持っています:

  1. server
  2. server.model
  3. server.persistence

server.modelワークスペースがビルドされると、 と の jar が作成され、プロジェクトserver.persistenceの正しい lib ディレクトリに配置されるように、ant ビルド スクリプトがあります。server

では、とserverの両方から自動配線できますが、 とまったく同じであるにもかかわらず、私のBean では配線されません。 server.modelserver.persistenceserver.modelserver.persistenceserver

私のサーブレットアプリケーション構成からのスニペット:

<context:component-scan base-package="com.impersonal.server"/>          

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore"/>

<bean autowire="byType" id="userList" class="com.impersonal.server.model.UserList"/>

serverプロジェクトとプロジェクトの両方に次のコードがありserver.model、サーバーのみが実行されます。失敗したものは次のとおりです。

package com.impersonal.server.model;

import java.util.ArrayList;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;

import com.impersonal.server.persistance.AppEngineDataStore;
import com.impersonal.server.persistance.IDataStore;

public class UserList extends ArrayList<User>
{
    private UserList(){}

//this is always null, but the same line in a class in the other project works
private @Autowired AppEngineDataStore _dataStore;

public UserList(UUID userId, String tempId)
{
    String poo = "poo";
    poo.concat("foo ");

    int i = 3;
}
}

編集:アプリケーション構成でBeanとして定義していないものを@Autowiredしようとしてプロジェクト でテストを行ったserver.modelところ、エラーは発生しませんでした。serverプロジェクトで同じことをした場合と同じように、「そのようなビーンが見つかりません」というエラーが発生するはずでした。

理由はありますか?

4

5 に答える 5

3

オブジェクトを誤ってインスタンス化していました。フレームワークオブジェクトなどのMVCコントローラーの場合、@Autowiredメンバーを配線するために何もする必要はありません。

その場で作成していたオブジェクトの場合、IOCコンテナーを通過していなかったため、依存関係が満たされていませんでした。

于 2012-06-21T19:16:09.520 に答える
1

<context:component-scan/>タグは注釈付きクラスを検索します。

@Autowireアノテーションを使用してクラスを自動配線する場合、自動配線クラスにはステレオタイプアノテーション(@ Component、@ Controller、@ Service、@ Repository)のいずれかでアノテーションを付ける必要があります。Springは、最初にアノテーション構成を解決し、次にxml構成を解決します。これは春のドキュメントに次のように書かれています

アノテーションインジェクションはXMLインジェクションの前に実行されるため、後者の構成は、両方のアプローチで配線されたプロパティの前者をオーバーライドします。

春のドキュメントで証明を確認してください。

したがって、実行する必要があるのは、serverプロジェクトおよびからのクラスのアノテーションを追加することですserver.model。3番目のプロジェクトの場合も同じserver.persistenceです。レイヤーまたは機能に応じて注釈を追加します。

于 2012-06-21T12:52:45.513 に答える
0

xml構成で、autowire-candidateプロパティを使用します

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore" autowire-candidate="true" />
于 2012-06-21T09:10:42.337 に答える
0

試す:

@Autowired(required = true)
private AppEngineDataStore _dataStore;

それ以外の:

private @Autowired AppEngineDataStore _dataStore;

編集1:

上記の autowire を使用しているときに、Spring xml で次のことを試してください。

<bean id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore" scope="prototype"></bean>

それ以外の:

<bean autowire="byType" id="appEngineDataStore" class="com.impersonal.server.persistance.AppEngineDataStore"/>
于 2012-06-21T08:42:10.100 に答える
0

autowirexml では、少し異なることを意味します。Bean を xml で定義する代わりに、 として注釈を付けることができます。@Serviceコンポーネント スキャンによって検出され、@Autowired動作します。

于 2012-06-21T09:05:04.443 に答える