1

Jboss にデプロイした既存のサービス Bean があります。残念ながら、dataSource 参照は、JNDI サービスの「mappedName」ルックアップを介してデータソース参照を注入するように構成されています。

@Resource(name = "dataSource", mappedName = "java:/OracleDS")
private DataSource dataSource = null;

JNDI 以外の環境で Bean をテストしたい。JNDI 以外の環境で実行すると、この例外が発生することが予想されました。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'myService': Injection of resource fields failed; nested exception 
is org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean 
definition with name 'java:/OracleDS' defined in JNDI environment: JNDI lookup 
failed; nested exception is javax.naming.NoInitialContextException: Need to 
specify class name in environment or system property, or as an applet parameter, 
or in an application resource file:  java.naming.factory.initial

これを修正する最も簡単な方法は、mappedName の制限を削除することだと認識しています。これは、本番またはテストのスプリング コンテキストがデータソースを定義できるためです。しかし、私がこれを行うことができない場合。上記の例外を回避するために、テストスプリングコンテキストを介して InitialContext を定義する方法はありますか?

4

1 に答える 1

0

SimpleNamingContextBuilderをもう少し読んで、テストケース用にこのコンテキスト設定を思いつきました。MethodInvokingFactoryBeanを使用して、bind()メソッドが確実に呼び出されるようにするための秘訣です。

<bean id="jndiContext" class="org.springframework.mock.jndi.SimpleNamingContextBuilder" factory-method="emptyActivatedContextBuilder"/>

<bean id="invokingFactoryBean"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <ref local="jndiContext" />
    </property>
    <property name="targetMethod">
        <value>bind</value>
    </property>
    <property name="arguments">
        <list>
            <value>java:/OracleDS</value>
            <ref bean="dataSource" />
        </list>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${datasource.driverClassName}" />
    <property name="url" value="${datasource.url}" />
    <property name="username" value="${datasource.username}" />
    <property name="password" value="${datasource.password}" />
</bean>
于 2012-06-15T10:01:21.607 に答える