新しい Spring 3.x コード ベースの @Configuration スタイルに移行しています。ここまではうまくいきましたが、C3p0 接続プール @Profile("standalone") の代わりに @Profile("production") を追加して JNDI データ ソースを選択しようとすると、次のようになります。
Error creating bean with name 'dataSource': Requested bean is currently in creation: Is there an unresolvable circular reference?
...
もちろん、詳細はたくさんありますが(参考のために以下にいくつか含めました)、私の質問は次のとおりです。
ありがとう、
詳細:
- XML と同じ構成が正常に機能し、
- web.xml は、AppConfig.class で構成されたルート コンテキストと、WebConfig.class で構成されたサーブレット コンテキストを指します。
- AppConfig には @Import(SomeConfig.class) があり、サービス レイヤー プロジェクトから構成をプルします。依存関係は Maven によって配線されます。
- SomeConfig クラスには、C3p0 データソースに @Profile("standalone") があります。
- AppConfig クラスには、JNDI データソースに @Profile("production") があり、web.xml は spring.profiles.default=production を定義します。
編集:解決済み
プロファイルを適切な場所に移動しました。現在、それらは同じファイルと同じプロジェクトにあります。
...
other bean definitions
/**
* Stand-alone mode of operation.
*/
@Configuration
@Profile("standalone")
static class StandaloneProfile {
@Autowired
private Environment env;
/**
* Data source.
*/
@Bean
public DataSource dataSource() {
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(env.getRequiredProperty("helianto.jdbc.driverClassName"));
ds.setJdbcUrl(env.getRequiredProperty("helianto.jdbc.url"));
ds.setUser(env.getRequiredProperty("helianto.jdbc.username"));
ds.setPassword(env.getRequiredProperty("helianto.jdbc.password"));
ds.setAcquireIncrement(5);
ds.setIdleConnectionTestPeriod(60);
ds.setMaxPoolSize(100);
ds.setMaxStatements(50);
ds.setMinPoolSize(10);
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
* Production mode of operation.
*/
@Configuration
@Profile("production")
static class ProductionProfile {
@Autowired
private Environment env;
/**
* JNDI data source.
*/
@Bean
public DataSource dataSource() {
try {
JndiObjectFactoryBean jndiFactory = new JndiObjectFactoryBean();
jndiFactory.setJndiName("java:comp/env/jdbc/heliantoDB");
jndiFactory.afterPropertiesSet(); //edited: do not forget this!
return (DataSource) jndiFactory.getObject();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}