2017-09-18 18 views
-1

Spring @ContextConfigurationアノテーションの読んだところから、複数のXMLコンテキストファイルまたは複数のJavaConfigクラスを読み込むことができます。私が必要とするのは、1つのXMLコンテキストファイルと1つのクラスからロードすることです。私が見たすべての例は、すべてのXML、またはすべてのクラスをロードしますが、両方をロードすることはありません。Spring ContextConfigurationをXMLとJavaConfigの両方からロードする方法

私はテストクラスを必要としています。これは、予想されるSpring配線を検証して、デフォルトのapplicationContext.xmlファイル(現在は "src/test/resources"デフォルトで直接指定する方法を理解しようとしています)、利用可能なJNDIリソースを指定するJavaConfigクラスもあります。テストの目的で、これらのJNDIリソースをダミー文字列に設定するだけですが、私のテストではいくつかの設定がそれらのダミー文字列と等しいことを確認しなければならないので、外部XMLファイルの代わりにインライン静的クラスでそれらを指定するのが本当に好きです。値とチェックの両方が

これまでに何があったのですか?私が最初に@ContextConfigurationをコメントアウトし、@ContextHierarchyブロックに戻ってコメントする場合

@Configuration 
public static class Config { 
    @Bean public String uslDatasourcesList() { return "abc"; } 
    @Bean public String atgDatasourcesList() { return "abc"; } 
    @Bean public String uslTableNamePrefixsList() { return "abc"; } 
    @Bean public String atgTableNamePrefixsList() { return "abc"; } 
    @Bean public String doNotifications() { return "false"; } 
    @Bean public DataSource abc() { return new DriverManagerDataSource(); } 
} 

:クラスの最後に

@RunWith(SpringRunner.class) 
@ContextConfiguration(value = {"/testApplicationContext.xml", "/testResources.xml"}) 
//@ContextHierarchy({ 
// @ContextConfiguration("/testApplicationContext.xml"), 
// @ContextConfiguration(classes = SpringWiringTest.Config.class) 
//}) 
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" }) 
public class SpringWiringTest { 

そして、この:私はこれを説明することができる、試してみました、私はこのようなエラーが発生します。

エラー名でBeanを作成する「uslDatasourcesList」:INIT メソッドの呼び出しに失敗しました。 環境やシステムプロパティで、またはアプレットのパラメータとして、または アプリケーションリソースファイル内のクラス名を指定する必要があります:java.naming.factory.initialの

ネストされた例外は javax.naming.NoInitialContextExceptionです更新

設定に「エントリポイント」としてJavaConfigまたはXMLのいずれかを選ぶのガイドラインを使用して、ここで私がしようとしているかを示すいくつかの修正の抜粋は以下のとおりです。

@RunWith(SpringRunner.class) 
@ContextConfiguration 
//@ContextConfiguration(value = {"file:src/main/webapp/WEB-INF/applicationContext.xml", "/testResources.xml"}) 
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" }) 
public class SpringWiringTest { 
    ... 
    @BeforeClass 
    public static void setup() throws Exception { 
     SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); 
     DataSource ds = new DriverManagerDataSource(); 
     builder.bind("java:comp/env/abc", ds); 
    } 
    ... 
    @Configuration 
    @ImportResource("file:src/main/webapp/WEB-INF/applicationContext.xml") 
    public static class Config { 
     @Bean public String uslDatasourcesList() { return "abc"; } 
     @Bean public String atgDatasourcesList() { return "abc"; } 
     @Bean public String uslTableNamePrefixsList() { return "abc"; } 
     @Bean public String atgTableNamePrefixsList() { return "abc"; } 
     @Bean public String doNotifications() { return "false"; } 
     @Bean public DataSource abc() { return new DriverManagerDataSource(); } 
    } 
} 

私は私のテストを実行すると、下は例外で、この言う「によって引き起こされる」:javax.naming.NameNotFoundExceptionが:によって引き起こさ

名 は[uslDatasourcesList]バインドされていません。 1つのバインディング:[ジャワ:COMP/ENV/ABC]コメントアウトを使用して別のバージョンでは

、「@ContextConfiguration」(とConfigクラスとその注釈をコメントアウト)、このエラーは発生しません。エラーメッセージ、「uslDatasourcesList」に記載されたBeanが両方のバージョンで定義されていることを

<bean id="uslDatasourcesList" class="java.lang.String"> <constructor-arg value="abc"/> </bean> 
<bean id="atgDatasourcesList" class="java.lang.String"> <constructor-arg value="abc"/> </bean> 
<bean id="uslTableNamePrefixList" class="java.lang.String"> <constructor-arg value="abc"/> </bean> 
<bean id="atgTableNamePrefixList" class="java.lang.String"> <constructor-arg value="abc"/> </bean> 
<bean id="doNotifications" class="java.lang.String"> <constructor-arg value="false"/> </bean> 

<bean id="abc" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
</bean> 

注意が、それはで働いていない。この私の「testResources.xml」ファイルの肉という

注意JavaConfigとXM​​Lを混在させたバージョン。

"@ImportResource"アノテーションのBeanは、JavaConfigクラスで宣言されたBeanがマージされる前に、自分自身で評価されているように見えます。

答えて

0

これは、SpringリファレンスマニュアルのMixing XML, Groovy scripts, and annotated classesセクションに明記されています。要約すると

、...

...あなたは、エントリポイントとして1を選択する必要がありますが、その一方が他方を含めるか、インポートする必要があります。

したがって、次のようになります。うまくいけば、はあなたの問題を解決します。

@RunWith(SpringRunner.class) 
@ContextConfiguration 
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" }) 
public class SpringWiringTest { 

    // ... 

    @Configuration 
    @ImportResource({"/testApplicationContext.xml", "/testResources.xml"}) 
    static class Config { 
     // ... 
    } 

} 
+0

はい、私はそのセクションを見ましたが、その行に沿って何か試しましたが、動作させることができませんでした。私は今これを行う唯一の方法であるように見えるので、もっと頑張ろうとします。この試行の詳細を投稿に更新します。 –

関連する問題