web-dev-qa-db-ja.com

jndiルックアップをxmlからJava config)に変換する方法

現在、xmlをJava configに変換しています。しかし、数日間調査している部分で立ち往生しています。ここで問題が発生します。

Xml構成:

_     <jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" />

     <beans:bean id="jdbcTemplate"
     class="org.springframework.jdbc.core.JdbcTemplate" >
     <beans:property name="dataSource" ref="dbDataSource"></beans:property>
     </beans:bean>
_

これまでのところ、私はこのコードを変換することができました:

_<jee:jndi-lookup id="dbDataSource" jndi-name="${db.jndi}" resource-ref="true" />_

これに:

_@Bean(name = "dbDataSource")
public JndiObjectFactoryBean dataSource() {
   JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
   bean.setJndiName("${db.jndi}");
   bean.setResourceRef(true); 
   return bean; 
}
_

この :

_     <beans:bean id="jdbcTemplate"
     class="org.springframework.jdbc.core.JdbcTemplate" >
     <beans:property name="dataSource" ref="dbDataSource"></beans:property>
     </beans:bean>
_

これに:

_@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate() { 
   JdbcTemplate jt = new JdbcTemplate();
    jt.setDataSource(dataSource);
    return jt;
   }
_

問題はメソッドですsetDataSource() DataSourceオブジェクトが必要ですが、両方のBeanを関連付ける方法がわかりません。JndiObjectFactoryBeanをDataSourceに渡す方法は?

または、別の方法を使用する必要がありますか?

追加の質問:

bean.setJndiName("${db.jndi}")$ {db.jndi}はプロパティファイルを参照していますが、常にNameNotFoundExceptionが発生します、それを機能させる方法は?

ありがとう!

9
FreezY

JndiObjectFactoryBeanの代わりにJndiDataSourceLookupを使用してください。メソッドで${db.jndi}を使用するには、メソッド引数を宣言し、それに@Valueアノテーションを付けます。

@Bean(name = "dbDataSource")
public DataSource dataSource(@Value("${db.jndi}" String jndiName) {
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    return lookup.getDataSource(jndiName);
}

自動配線されたメソッドとコンストラクターは、@Valueアノテーションを使用することもできます。 --Springリファレンスガイド。

@Beanメソッドは基本的にファクトリメソッドであり、自動配線メソッドでもあるため、このカテゴリに分類されます。

JdbcTemplateのファクトリメソッドでは、DataSourceメソッド引数を使用してデータソースへの参照を取得できます(複数ある場合は、メソッド引数に@Qualifierを使用できます使用するものを指定します)。

@Bean
public JdbcTemplate jdbcTemplate(DataSource ds) { 
    return new JdbcTemplate(ds);
}
15
M. Deinum