0

新しい 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);
        }
    }

}
4

0 に答える 0