1

複数のSpringプロジェクトとして存在する既存のアプリケーションがあります。プロジェクトAのSpringコンテキストXMLファイルは、を使用してBのSpringコンテキストXMLファイルを実装します。

<import resource="classpath*:/META-INF/spring/BContext.xml" />

しかし、私はそれを取得しFileNotFoundExceptionます。これは、リソースがプロジェクトBのバンドルによって公開されていないことが原因であると思います。クラスにはアクセスできますが、ファイルにはアクセスできません。

この問題を調査するときの一般的なコメントは、Beanを直接注入しようとするのではなく、OSGiサービスを使用してサービスを注入することでした。ただし、これは既存のアプリケーションなので、全体を再配線することは避けたいと思います。

OSGiにリソースをエクスポートするように指示する方法はありますか?KarafでServiceMixを実行しています。

4

3 に答える 3

3

これは単なるクラスパスリソースなので、適切なExport-Packageディレクティブを追加することでうまくいくと思います。しかし、それは間違いなく正しい方法ではありません。そのコンテキストファイルのパスは、おそらくBContext.xmlを含むプロジェクトがSpringDynamicModulesで動作するようにすでに設定されていることを示しています。その場合、そのバンドルを開始すると、SpringApplicationContextがサービスとしてエクスポートされます。OSGiコンソールでそれを探してください。

編集:コメントでの議論に応えて:

私はこれを自分で試したことがありませんが、理論的には、Spring DMのosgi名前空間を使用して、プロジェクトBのApplicationContextであるOSGiサービスへのBean参照を作成できるはずです。次に、ApplicationContextであるBeanを使用して、通常のSpring構成を使用しgetBean()メソッドの1つ 使用してそこからBeanを抽出できます。この例のセクションの下部に示されているように、Spring構成でファクトリメソッドへの引数を指定するために使用できることに注意してください。 <constructor-arg ... />

于 2011-07-19T20:06:59.943 に答える
3

別のモジュールからSpringContextとすべての実装クラスをロードすることは、モジュールのカプセル化に大きく違反します。それを喜んで行うのであれば、AとBを別々のバンドルにすることはまったく意味がなく、単一のバンドルにすることもできます。

于 2011-07-20T12:58:34.863 に答える
3

これを行う方法は、OSGiサービスを利用することです。次のコマンドを使用してSpringDMにサービスを登録できます(これは通常、別のosgi-context.xmlファイルで行われ、コードベースがテスト目的でOSGiに依存しないようにします。この例では、 BContext.xmlで定義され、OSGiサービスとして参照されるidクリニック

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

    <service id="osgiClinic" ref="clinic" interface="org.springframework.petclinic.repository.Clinic" />

</beans:beans>

次に、消費バンドルのosgi-context.xmlで、サービスを参照します。以下の例では、最初のBeanのコードを利用するclinicというBeanがあります。

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

    <reference id="clinic" interface="org.springframework.petclinic.repository.Clinic"/>

</beans:beans>

この方法で、バンドル間の依存関係について考え、他のバンドルに必要なサービスのみをエクスポートするようになります。

于 2011-07-20T15:25:43.683 に答える