繁体   English   中英

BeanCurrentlyInCreationException 请求的 bean 当前正在创建中:是否存在无法解析的循环引用?

[英]BeanCurrentlyInCreationException Requested bean is currently in creation: Is there an unresolvable circular reference?

在开发springboot项目的时候,遇到了上面的错误。奇怪的是项目在IDEA中运行良好,并报告异常运行为jar。更奇怪的是我的同事可以package没有异常Z684995Z684995FCBF4324924 所以我认为这是我自己的计算机环境有问题。

这是我电脑的工具版本: Maven 3.6.2 Java 版本:1.8.0_181

这是pom文件:

<parent>
    <groupId>com.tct.bigdata</groupId>
    <artifactId>teye-analyze</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>report</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>report</name>
<description>Report picture and chart to web page</description>


<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
    </dependency>
    <dependency>
        <groupId>com.tct.bigdata</groupId>
        <artifactId>data-commons</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <!--Redis 数据库读写依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!--spring2.0集成redis所需common-pool2-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.4.2</version>
    </dependency>

    <!--fastJson支持-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.56</version>
    </dependency>

</dependencies>

<build>
    <finalName>bigdata-report</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler.version}</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <!-- 释放打包时过滤 -->
            <!--<configuration>
                <layout>ZIP</layout>
                <includes>
                    <include>
                        <groupId>nothing</groupId>
                        <artifactId>nothing</artifactId>
                    </include>
                </includes>
            </configuration>-->
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
        </plugin>-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.2</version>
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.tct.bigdata.report.ReportApplication</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/lib</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>-->
    </plugins>
</build>

详细错误信息:

原因:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“hibernateConfiguration”的bean时出错:通过字段“readDataSource01”表示的依赖关系不满足; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 class 路径资源 [com/tct/bigdata/report/config/DataSourceConfiguration.class] 中定义名称为“readDataSource01”的 bean 创建错误:bean 初始化失败; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker' 的 bean 时出错:调用 init 方法失败; 嵌套异常是 org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为“dataSource”的 bean 时出错:当前正在创建请求的 bean:是否存在无法解析的循环引用?

这是我的配置类:

@Configuration
public class DataSourceConfiguration {

    private static Logger log = LoggerFactory.getLogger(DataSourceConfiguration.class);

    @Value("${mysql.datasource.type}")
    private Class<? extends DataSource> dataSourceType;

    /**
     * 写库 数据源配置
     * @return
     */
    @Bean(name = "writeDataSource")
    @ConfigurationProperties(prefix = "mysql.datasource.write")
    public DataSource writeDataSource() {
        log.info("-------------------- writeDataSource init ---------------------");
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder = dataSourceBuilder.type(dataSourceType);
        DataSource dataSource = dataSourceBuilder.build();

        return dataSource;
    }

    /**
     * 有多少个从库就要配置多少个
     * @return
     */
    @Bean(name = "readDataSource01")
    @ConfigurationProperties(prefix = "mysql.datasource.read01")
    public DataSource readDataSourceOne() {
        log.info("-------------------- read01 DataSourceOne init ---------------------");
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder = dataSourceBuilder.type(dataSourceType);
        return dataSourceBuilder.build();
//        return DataSourceBuilder.create().type(dataSourceType).build();
    }
}








@Configuration
@AutoConfigureAfter(DataSourceConfiguration.class)
public class HibernateConfiguration {

    private static Logger log = LoggerFactory.getLogger(HibernateConfiguration.class);

    @Value("${mysql.datasource.readSize}")
    private String readDataSourceSize;

    @Autowired
    @Qualifier("writeDataSource")
    private DataSource writeDataSource;

    @Autowired
    @Qualifier("readDataSource01")
    private DataSource readDataSource01;

    /**
     * 把所有数据库都放在路由中
     * @return
     */
    @Primary
    @Bean(name="dataSource")
    public AbstractRoutingDataSource roundRobinDataSouceProxy() {

        Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
        //把所有数据库都放在targetDataSources中,注意key值要和determineCurrentLookupKey()中代码写的一至,
        //否则切换数据源时找不到正确的数据源
        targetDataSources.put(DataSourceType.write.getType(), writeDataSource);
        targetDataSources.put(DataSourceType.read.getType()+"1", readDataSource01);

        final int readSize = Integer.parseInt(readDataSourceSize);

        //路由类,寻找对应的数据源
        AbstractRoutingDataSource proxy = new AbstractRoutingDataSource(){
            private AtomicInteger count = new AtomicInteger(0);
            /**
             * 这是AbstractRoutingDataSource类中的一个抽象方法,
             * 而它的返回值是你所要用的数据源dataSource的key值,有了这个key值,
             * targetDataSources就从中取出对应的DataSource,如果找不到,就用配置默认的数据源。
             */
            @Override
            protected Object determineCurrentLookupKey() {
                String typeKey = DataSourceContextHolder.getReadOrWrite();

                if(typeKey == null){
                        return DataSourceType.write.getType();
                }

                if (typeKey.equals(DataSourceType.write.getType())){
                    return DataSourceType.write.getType();
                }

                //读库, 简单负载均衡
                int number = count.getAndAdd(1);
                int lookupKey = number % readSize;
                log.info("使用数据库read-"+(lookupKey+1));
                return DataSourceType.read.getType()+(lookupKey+1);
            }
        };

        proxy.setDefaultTargetDataSource(writeDataSource);//默认库
        proxy.setTargetDataSources(targetDataSources);
        return proxy;
    }
}

请显示您的配置类。

顺便说一句,您在 maven 中有一些重复项:data-redis 是重复的。 我也怀疑你是否需要 data-jpa 和 data-jdbc,但这取决于你

根据您的描述,由于依赖项重复,问题可能出在您的“真实”类路径(由 jar 中的 maven 构建,而不是由 IDEA 构建)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM