涉及包含bean'XXX'的循环引用-考虑从独立于其包含实例的工厂方法声明为静态方法

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

  

org.springframework.beans.factory.BeanCreationException:创建名称为'globalWebConfig'的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动连线字段:com.kla.it.dao.Dao com.kla.it.global.conf.GlobalWebConfig.dao;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为'daoImpl'的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动连线字段:org.springframework.jdbc.core.JdbcTemplate com.kla.it.dao.impl.DaoImpl.template;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:在类路径资源[com / kla / it / database / DatabaseConfig.class]中创建名称为'template'的bean时创建错误:通过索引为0的构造函数参数表示的不满意依赖项类型[javax.sql.DataSource] ::在com.kla.it.global.conf.GlobalWebConfig中定义的名称为'partsDs'的bean创建时出错:通过工厂方法的bean实例化失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.jdbc.datasource.DriverManagerDataSource]:涉及包含bean'globalWebConfig'的循环引用-考虑将工厂方法声明为静态方法,以使其与包含其实例的方法独立。工厂方法“ getPartsDataSource”抛出异常;嵌套的异常是java.lang.NullPointerException;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建com.kla.it.global.conf.GlobalWebConfig中定义的名称为“ partsDs”的bean时出错:通过工厂方法实例化Bean失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.jdbc.datasource.DriverManagerDataSource]:涉及包含bean'globalWebConfig'的循环引用-考虑将工厂方法声明为静态方法,以使其与包含其实例的方法独立。工厂方法“ getPartsDataSource”抛出异常;嵌套的异常是java.lang.NullPointerException           在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcesspropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)处           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)           在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:305)           在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)           在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)           在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)           在org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)           在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:834)处           在org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)           在org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)           在org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)           在org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)           在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4680)           在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5143)           在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)           在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)           在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)           在org.apache.catalina.core.StandardHost.addChild(StandardHost.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 Config类

@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;
    }
}

hesong0516 回答:涉及包含bean'XXX'的循环引用-考虑从独立于其包含实例的工厂方法声明为静态方法

请尝试以下代码。可以了!
1.特定数据源引用的@Qualifier(按名称)。
2. @Import聚合所有配置类。

    @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 {
}
本文链接:https://www.f2er.com/3029600.html

大家都在问