0

我正在转向基于 @Configuration 样式的新 Spring 3.x 代码。到目前为止,我做得很好,但是当我尝试添加 @Profile("production") 来选择 JNDI 数据源而不是 C3p0 连接池 @Profile("standalone") 时,我得到了:

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 中配置的 servlet 上下文,
  • 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