3

私は次のような豆mongoServiceを持っています

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">

    <context:property-placeholder location="file:///storage//local.properties"/>
    <bean id="mongoService" class="com.business.persist.MongoService">
    <constructor-arg value="${host}"/>
    <constructor-arg value="${port}"/>
    <constructor-arg value="${database}"/>
    </bean>
</beans>   
  • このBeanを別のプロジェクトに含める必要があるため、このプロジェクトのjarを作成し、次のようなMaven依存関係として追加しました。

        <dependency>
            <groupId>com.project</groupId>
            <artifactId>business</artifactId>
            <version>master-SNAPSHOT</version>
        </dependency>   
    
  • このフィールドを挿入する必要があるファイルで、次のことを行います

public class DocumentSaver implements IDocumentSaver {
    @Resource
    private MongoService mongoService;

    public boolean addDocument(Document doc) {
       // do other things

       // add document to mongo   
       mongoService.putDocument(document);

       return true;
    }
}  

次に、次のようにテストを実行します

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/com/wireup.xml")
public class DocumentSaverTest extends DocumentCase {

    @Test
    public void loadAndSave() {
             DocumentSaver saver = new DocumentSaver();
             Document doc = new Document();
             // fill the doc
             saver.addDocument(doc);
        }
}  

NullPointerExceptionがこれを同じように実行するとsaver.addDocument(doc);

私が間違っていることを教えてください

ありがとうございました

4

5 に答える 5

2

次のようにNEW演算子を使用して「DocumentSaver」を作成しないでください。SpringApplicationContextから取得してください。

DocumentSaver saver = new DocumentSaver();

NEW操作を使用する場合、Springは依存オブジェクトを注入しません。

于 2012-07-03T17:24:57.397 に答える
1

私の勘では、DocumentSaverはSpringによって管理されていないため、MongoServiceは自動配線されていません。DocumentSaverをspringxmlファイルでspringbeanとして定義し、MongoService参照をそれにワイヤリングするか、注釈を付けて(たとえば、@ Repositoryまたは@Componentとして)、xmlファイルでcomponent-scanを使用することができます。

次に、new演算子を使用してDocumentSaverオブジェクトを作成しているようです。MongoServiceを自動配線するには、SpringコンテキストからBeanをフェッチする必要があります。または、DocumentSaverをSpring Beanにしたくない場合の別のオプションは、アスペクトウィービングを利用するDocumentSaverで@Configurableを使用することです。

于 2012-07-03T17:25:15.853 に答える
1
  1. セーバーに。で注釈を付けます@ComponentBeanここでの代替案は、これをXMLファイルの別のレギュラーとして宣言します。
  2. @AutowiredあなたのMongoService;
  3. @AutowiredあなたのテストクラスであなたDocumentSaverに。saver

編集されたクラスは次のとおりです。

コンポーネントは次のようになります。

@Component
public class DocumentSaver implements IDocumentSaver {

    @Autowired
    private MongoService mongoService;

    public boolean addDocument(Document doc) {
        // do other things

        // add document to mongo   
        mongoService.putDocument(document);

        return true;
    }
}  

そしてあなたのテストはこのようになります:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/com/wireup.xml")
public class DocumentSaverTest extends DocumentCase {

    @Autowired
    DocumentSaver saver;

    @Test
    public void loadAndSave() {
        Document doc = new Document();
        // fill the doc
        saver.addDocument(doc);
    }
}  
于 2012-07-03T17:26:10.263 に答える
1

DocumentSaverを新しいものでインスタンス化する場合、Springコンテキストに配置しません。したがって、Springはそれを認識せず、注入は行われません。

MongoServiceを組み込みたい場合は、Springまでにインスタンス化する必要があります。

あなたのwireup.xmlファイルに追加してください:

<bean id="documentSaver" class="com....DocumentSaver" />

次に、このdocumentSaverをテストに挿入します。

@Autowired
private DocumentSaver documentSaver;

あなたの命名規則は悪いです。

DocumentSaverクラスはDAOのようです(ドキュメントを永続化することが目的であるため)。したがって、@ Repositoryで注釈を付け、DocumentSaverDAOという名前を付けます。

私の答えとSpaethの答えを組み合わせると、うまく機能し、うまくパッケージ化されます。

于 2012-07-03T17:27:14.523 に答える
1

DocumentSaverSpringで管理するか(現在は作成していないのでそうではありませんnew)、または織り込まれている必要があります。これにより、などの依存関係MongoServiceが注入されます。を使用して作成されたオブジェクトへの依存性注入の詳細については、この回答を参照してくださいnew

于 2012-07-03T17:59:41.763 に答える