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とXMLを混在させたバージョン。
"@ImportResource"アノテーションのBeanは、JavaConfigクラスで宣言されたBeanがマージされる前に、自分自身で評価されているように見えます。
はい、私はそのセクションを見ましたが、その行に沿って何か試しましたが、動作させることができませんでした。私は今これを行う唯一の方法であるように見えるので、もっと頑張ろうとします。この試行の詳細を投稿に更新します。 –