当前位置: 首页 > 知识库问答 >
问题:

包含bean 'xxx '的循环引用-考虑将工厂方法声明为静态以独立于其包含实例

蓝昊天
2023-03-14

我正在使用spring创建两个项目globalDB和GlobalWeb。我想在GlobalWeb中创建多个数据库连接,Jdbc属性是在GlobalWeb启动时从GlobalDB项目dao层获取的。当我运行全球网络时,我遇到了以下异常。

org.springframework.beans.factory.BeanCreation异常:创建名为"globalWebConfig"的bean时出错:自动构建依赖项的注入失败;嵌套异常org.springframework.beans.factory.BeanCreation异常:无法自动构建字段:com.kla.it.dao.com.kla.it.global.conf.GlobalWebConfig.dao;嵌套异常org.springframework.beans.factory.创建名为daoImpl的bean时出错:自动加载依赖项的注入失败;嵌套异常org.springframework.beans.factory.BeanCreation异常:无法自动绑定字段:org.springframework.jdbc.core.JdbcTemboardcom.kla.it.dao.impl.DaoImpl.template;嵌套异常是org.springframework.beans.factory.不满足依赖异常:错误创建bean与名称'模板'定义在类路径资源[com/kla/it/数据库/数据库onfig.class]:不满足依赖表示通过构造函数参数与索引0的类型[javax.sql.数据源]:: 创建名为'partsDs'的bean时出错com.kla.it.global.conf.GlobalWebConfig:通过工厂方法的Bean实例化失败;嵌套异常org.springframework.beans.BeanInstantiation异常:无法实例化[org.springframework.jdbc.datasource.DriverManagerDataSource]:涉及包含bean'globalWebConfig的循环引用-考虑将工厂方法声明为静态,以便独立于其包含的实例。工厂方法getPartsDataSource抛出异常;嵌套异常java.lang.NullPointerExctive;嵌套异常org.springframework.beans.factory.BeanCreation异常:创建名为partsDs的bean时出错com.kla.it.global.conf.GlobalWebConfig中定义:通过工厂方法进行Bean实例化失败;嵌套异常是org. springframework. bean。BeanInstantiation异常:实例化[org. springframework. jdbc. datasource失败。DriverManagerDataSource]:涉及包含bean的循环引用“globalWebConfig”——考虑将工厂方法声明为静态,以便独立于其包含的实例。工厂方法“getPartsDataSource”抛出异常;嵌套异常是java. lang。nullPointerExctive位于org. springframework. bean. factory. anNotation。AutowiredAnNotationBeanPostProcessor. postProcess财产价值(AutowiredAnNotationBeanPostProcessor. java: 334)位于org. springframework. bean. Factory. support。AbstractAutowireCapableBeanFactory. java: 1214)位于org. springframework. bean. Factory。AbstractAutowireCapableBeanFactory. doCreateBean(AbstractAutowireCapableBeanFactory. java: 5AbstractBeanFactory1美元. getObject(AbstractBeanFactory. java: 305)在org. springframework. bean. factory. support。DefaultSingletonBean注册. getSingleton(DefaultSingletonBean注册. java: 230)在org. springframework. bean. factory. support。AbstractBeanFactory. doGetBean(AbstractBeanFactory. java: 301)在org. springframework. bean. factory. support。AbstractBeanFactory. getBean(AbstractBeanFactory. java: 196)在org. springframework. bean. support。DefaultListableBeanFactory. preInstantiateSingletons(DefaultListableBeanFactory. java: 772)在org. springframework. content. support。摘要在org. apache. catalina. core的标准内容。开始内部(标准内容。java: 5143)。生命之源。启动(生命之源:183)在org. apache. catalina. core。容器基地。addChild内部(容器基地。java: 717)在org. apache. catalina. core。容器基地。addchild(容器基地。java: 690)在org. apache. catalina. core。标准主机。addchild(标准主机。java: 705)

GlobalDB配置类

@Configuration
@ComponentScan(basePackages = "com.kla.it")
@PropertySource(value = {"classpath:database.properties"})
public class DatabaseConfig {

    @Autowired
    private Environment env;

//    @Bean(name="ds")
    public DataSource getDataSource(){
        System.out.println("++++++++++++++++DATABASE++++++++++++++START++++++++++++");
        System.out.println("Method to crate data source");
        DriverManagerDataSource ds = new DriverManagerDataSource();
        ds.setDriverClassName("net.snowflake.client.jdbc.SnowflakeDriver");
        ds.setUrl(env.getRequiredProperty("db.url"));
        ds.setUsername(env.getRequiredProperty( "db.username"));
        ds.setPassword(env.getRequiredProperty( "db.password"));
        return ds;
    }

    @Bean(name="template")
    public JdbcTemplate jdbcTemplate(DataSource ds) {
        System.out.println("Jdbc template method called.");
        JdbcTemplate template = new JdbcTemplate(ds);
        template.setResultsMapCaseInsensitive(true);
        System.out.println("++++++++++++++++DATABASE++++++++++++++END+++++++++++");
        return template;
    }
}

GlobalDB Dao层类

@Repository
@Qualifier("dao")
public class DaoImpl implements Dao{

    @Autowired
    JdbcTemplate template;
  @Override
    public Map<String, String> getConnectionsData(String appName, String env) {

        List<Map<String, Object>> reportsList = new ArrayList<>();
        Map<String, String> dataSourceMap = new HashMap<>();
        String qry = "SELECT * FROM DB_CONFIG WHERE name = '"+appName+"' AND ev = '"+env+"'";
         reportsList = template.queryForList(qry);
            int count = 1;
            for (Map<String, Object> map : reportsList) {
                dataSourceMap.put(String.valueOf(map.get("prop")), String.valueOf(map.get("val")));
            }
        return dataSourceMap;

    }
}

GlobalWeb配置类

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.kla.it")
@PropertySource(value = {"classpath:global.properties"})
public class GlobalWebConfig extends WebMvcConfigurerAdapter {

    @Autowired(required=true)
    Dao dao;

     @Bean(name = "partsDs")
     public DriverManagerDataSource getPartsDataSource(){
        Map<String, String> dsMap = dao.getConnectionsData("parts", "dev");
        DriverManagerDataSource partsDs= new DriverManagerDataSource();
        partsDs.setDriverClassName(dsMap.get("driver"));
        partsDs.setUrl(dsMap.get("url"));
        partsDs.setUsername(dsMap.get("user"));
        partsDs.setPassword(dsMap.get("password"));   
        return partsDs;
    }

     @Bean(name = "cosmosDs")
      public DriverManagerDataSource getCosmosDataSource(){
        Map<String, String> dsMap = dao.getConnectionsData("cosmos", "dev");
        DriverManagerDataSource cosmosDs = new DriverManagerDataSource();
        cosmosDs.setDriverClassName(dsMap.get("driver"));
        cosmosDs.setUrl(dsMap.get("url"));
        cosmosDs.setUsername(dsMap.get("user"));
        cosmosDs.setPassword(dsMap.get("password"));   
        return cosmosDs;
    }

      @Bean(name = "itsDs")
       public DataSource getITSDataSource(){
        Map<String, String> dsMap = dao.getConnectionsData("ITSecurity", "dev");
        DriverManagerDataSource itsDs= new DriverManagerDataSource();
        itsDs.setDriverClassName(dsMap.get("driver"));
        itsDs.setUrl(dsMap.get("url"));
        itsDs.setUsername(dsMap.get("user"));
        itsDs.setPassword(dsMap.get("password"));   
        return itsDs;
    }

    @Bean(name = "sfPartsDB")
    public JdbcTemplate snowFlakeParts() {
        System.out.println("Jdbc template method called.");
        DataSource cosmosDs = getPartsDataSource();
        JdbcTemplate sfPartsDB = new JdbcTemplate(cosmosDs);
        sfPartsDB.setResultsMapCaseInsensitive(true);
        return sfPartsDB;
    }

    @Bean(name = "sfCosmosDB")
    public JdbcTemplate snowFlakeCosmos() {
        System.out.println("Jdbc template method called.");
        DataSource cosmosDs = getCosmosDataSource();
        JdbcTemplate sfCosmosDB = new JdbcTemplate(cosmosDs);
        sfCosmosDB.setResultsMapCaseInsensitive(true);
        return sfCosmosDB;
    }
//    
    @Bean(name = "oracleDB")
    public JdbcTemplate oracleTemplate() {
        DataSource itsDs = getITSDataSource();
        JdbcTemplate oracleDB = new JdbcTemplate(itsDs);
        oracleDB.setResultsMapCaseInsensitive(true);
        return oracleDB;
    }
}

共有1个答案

龙玄天
2023-03-14

请尝试以下代码。真管用
1@特定数据源引用的限定符(按名称)
2@导入聚合所有配置类

    @Configuration
    @ComponentScan(basePackages = "com.kla.it")
    @PropertySource(value = {"classpath:database.properties"})
    public class DatabaseConfig {

        @Autowired
        private Environment env;

        @Bean(name="ds")
        public DataSource getDataSource(){
            System.out.println("++++++++++++++++DATABASE++++++++++++++START++++++++++++");
            System.out.println("Method to crate data source");
            DriverManagerDataSource ds = new DriverManagerDataSource();
            ds.setDriverClassName("net.snowflake.client.jdbc.SnowflakeDriver");
            ds.setUrl(env.getRequiredProperty("db.url"));
            ds.setUsername(env.getRequiredProperty( "db.username"));
            ds.setPassword(env.getRequiredProperty( "db.password"));
            return ds;
        }

        @Bean(name="template")
        public JdbcTemplate jdbcTemplate(@Qualifier("ds")DataSource ds) {
            System.out.println("Jdbc template method called.");
            JdbcTemplate template = new JdbcTemplate(ds);
            template.setResultsMapCaseInsensitive(true);
            System.out.println("++++++++++++++++DATABASE++++++++++++++END+++++++++++");
            return template;
        }
    }   


@Import(DatabaseConfig.class) /* add this line to aggrgate java configuration classes*/
@Configuration
@EnableWebMvc
@ComponentScanenter code here(basePackages = "com.kla.it")
@PropertySource(value = {"classpath:global.properties"})
public class GlobalWebConfig extends WebMvcConfigurerAdapter {
}
 类似资料:
  • 我的代码检查用户是否可用。请参见下面的片段: 我唯一的问题是它包含对变量的不安全引用,因为我得到以下错误: 我四处搜索并摆弄了我的代码,但我无法摆脱这个错误。我不知道去哪里找了。

  • 反应器中的项目包含循环引用:Vertex{tag='org.spigotmc: spiget-api: 1.8.8-R0.1-SNAPSHOT'}'和'Vertex{tag='org.spigotmc: spigot: 1.8.8-R0.1-SNAPSHOT'}'之间的边缘在图中引入循环org.spigotmc: spigot: 1.8.8-R0.1-SNAPSHOT- “Vertex { lab

  • (这很难搜索,因为结果都是关于“方法参考”) 我想为lambda表达式获取一个实例,用于传统的基于反射的API。应该包括clousure,因此调用应该与调用lambda具有相同的效果。 我已经研究了MethodHandles。查找,但它似乎只与反向转换相关。但是我想bind方法可能有助于包含clousure? 编辑: 假设我是lambda Expersion: 我有一个遗留框架(SpEL),它有一

  • 本文向大家介绍请说明一下JSP中的静态包含和动态包含的有哪些区别?相关面试题,主要包含被问及请说明一下JSP中的静态包含和动态包含的有哪些区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JSP 静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作jsp:forward包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"conte

  • 与strncmp相比,有没有一种方法可以使用标准库简化struct数组上的循环? 以下是我的尝试失败,因为std::count\U if抱怨没有重载函数std::begin matches的实例。 错误是: C2784:常量元素*标准::开始(标准::初始值设定项\u列表

  • 问题内容: 我熟悉静态工厂方法的概念和好处,如Joshua Bloch的EffectiveJava中所述: 工厂方法具有名称,因此与构造函数不同,您可以拥有多个具有相同签名的工厂方法。 工厂方法不必创建新的对象。他们可以返回先前创建的对象。这对于不可变对象或值对象很有用。 与构造方法不同,工厂方法可以返回其返回类型的任何子类型的对象。 现在,我正在尝试为正在学习Java和OO原理的人员解释静态工厂