4

CXF サービスに DAO を挿入しようとしています。この目的のために、xml 構成を使用しています。

私の app-servlet.xml に、次のエントリを追加しました。

    <bean id="blogService" class="blog.BlogEntriesImpl">
        <property name="blogDao" ref="blogDao" />
    </bean>

blogDao Bean もこのファイルで定義されています。

サービスは別の xml ファイルで構成されます。

    <import resource="classpath:META-INF/cxf/cxf.xml" />

    <jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl"
    address="/Blog1" />

BlogEntriesImpl は、サービス インターフェイスを実装します。dao 属性と setter メソッドがあります。

アプリケーションをデバッグしたところ、BlogEntriesImpl の 1 つのインスタンスが開始時にインスタンス化され、dao 属性を持っていることがわかりました。app-servlet.xml の Bean 構成によって行われると言えます。

ただし、サービスを呼び出すと、NullPointerException がスローされます。これは、使用されている BlogEntriesImpl の別のインスタンスです。

この問題を解決するために、サービス実装クラス (BlogEntriesImpl) の dao 属性を static として宣言しました。変数は、アプリケーションの開始時に設定されます。しかし、私はこの解決策が好きではありません。

CXF サービスに dao を挿入するより良い方法はありますか?

前もって感謝します!

4

1 に答える 1

4

その通りです。実際にはBlogEntriesImpl、Spring によって作成されたクラスと Apache CXF によって作成されたクラスの 2 つのインスタンスがあります。クラスを提供するのではなく、Spring Bean を使用するように Apache CXF に明示的に要求する必要があります。Writing a service with Spring を確認してください。置き換える必要があるようです。

<jaxws:endpoint id="blogService" implementor="blog.BlogEntriesImpl" address="/Blog1" />

と:

<jaxws:endpoint id="blogService" implementor="#blogService" address="/Blog1" />

Apache CXF が name の Bean を見つけられない場合はblogService、それを Spring MVC コンテキスト ( ) からメイン コンテキストに移動することを検討してapp-servlet.xmlください。

于 2012-07-07T15:05:39.357 に答える