首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Springboot :扫描bean时失败

Springboot :扫描bean时失败
EN

Stack Overflow用户
提问于 2020-08-18 20:13:23
回答 2查看 311关注 0票数 0

我在试着理解弹跳力的概念。

我有如下所述的项目结构。有两个包,我在每个包中有一个类。

代码语言:javascript
运行
复制
 src/main/java
      > com.emerald.paymentengine
         ApplicationRun.java
      > com.emerald.paymentengine.config
         DataSourceDbConfig.java

当我试图按照上面的结构运行ApplicationRun.java时,我得到的错误如下:

错误:

代码语言:javascript
运行
复制
2020-08-19 01:33:08.673  INFO 30128 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-19 01:33:08.673  INFO 30128 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-08-19 01:33:08.749  INFO 30128 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-19 01:33:08.750  INFO 30128 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 657 ms
2020-08-19 01:33:08.779  WARN 30128 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'applicationRun': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.emerlad.paymentengine.config.DataSourceDbConfig' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
2020-08-19 01:33:08.781  INFO 30128 --- [  restartedMain] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2020-08-19 01:33:08.791  INFO 30128 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-08-19 01:33:08.883 ERROR 30128 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.emerald.paymentengine.ApplicationRun required a bean of type 'com.emerlad.paymentengine.config.DataSourceDbConfig' that could not be found.


Action:

Consider defining a bean of type 'com.emerlad.paymentengine.config.DataSourceDbConfig' in your configuration.

但是,当我在下面提到的同一个包中移动DataSourceDbConfig.java时,它正在运行,并且我的输出低于:

代码语言:javascript
运行
复制
src/main/java
      > com.emerald.paymentengine
         ApplicationRun.java
         DataSourceDbConfig.java

输出:

代码语言:javascript
运行
复制
2020-08-19 01:37:24.726  INFO 34364 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-19 01:37:24.726  INFO 34364 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-08-19 01:37:24.810  INFO 34364 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-19 01:37:24.810  INFO 34364 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 722 ms
2020-08-19 01:37:24.849  INFO 34364 --- [  restartedMain] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: static com.emerald.paymentengine.DataSourceDbConfig com.emerald.paymentengine.ApplicationRun.dbConfig
Connection established !!
2020-08-19 01:37:24.981  INFO 34364 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-08-19 01:37:25.116  INFO 34364 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2020-08-19 01:37:25.140  INFO 34364 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2020-08-19 01:37:25.148  INFO 34364 --- [  restartedMain] c.emerald.paymentengine.ApplicationRun   : Started ApplicationRun in 1.335 seconds (JVM running for 2.406)

我认为@SpringBootApplication将自动扫描主包和子包,并能够选择所需的bean。正如第一个场景中提到的那样,如何通过将Config.java文件放置在不同的包中来使其工作呢?

代码:

ApplicationRun.java

代码语言:javascript
运行
复制
package com.emerald.paymentengine;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApplicationRun {
    
    @Autowired
    static
     DataSourceDbConfig dbConfig;
    
    
    public ApplicationRun(DataSourceDbConfig dbConfig){
        ApplicationRun.dbConfig = dbConfig  ;
    }
    

    public static void main(String[] args) {
        SpringApplication.run(ApplicationRun.class, args);
        
        dbConfig.dataSource();
    
    }

}

DataSourceDbConfig.java

代码语言:javascript
运行
复制
package com.emerlad.paymentengine.config;;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import oracle.jdbc.pool.OracleDataSource;
import java.sql.SQLException;
import javax.sql.DataSource;

@Component
@Configuration
@ConfigurationProperties("spring.datasource")

public class DataSourceDbConfig {
    
    @Value("${spring.datasource.url}")
    private String dbUrl;
        
    @Value("${spring.datasource.username}")
    private String dbUser;
        
    @Value("${spring.datasource.secure}")
    private String dbPasswrd;
    
    @Bean
    public DataSource dataSource() {
        
        OracleDataSource dataSource = null;
        try {
            dataSource = new OracleDataSource();
            dataSource.setUser(dbUser);
            dataSource.setPassword(dbPasswrd);
            dataSource.setURL(dbUrl);
            
            System.out.println("Connection established !!");
            
        } catch (SQLException e) {
            System.out.println("An issue occured while establishing connection !!");
            e.printStackTrace();
        }
        
        return dataSource;
    }

}
EN

回答 2

Stack Overflow用户

发布于 2020-08-18 20:42:01

老实说,我不明白您想要实现什么,但这就是如何在您的主要方法中获得DataSource bean:

ApplicationRun.java:

代码语言:javascript
运行
复制
package com.emerald.paymentengine;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.emerlad.paymentengine.config.DataSourceDbConfig;
import org.springframework.context.annotation.Import;
import javax.sql.DataSource;

@SpringBootApplication
@Import(DataSourceDbConfig.class)
public class ApplicationRun {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ApplicationRun.class, args);
        
        DataSource dataSource = context.getBean(DataSource.class)
    }
}

DataSourceDbConfig.java:

代码语言:javascript
运行
复制
package com.emerlad.paymentengine.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import oracle.jdbc.pool.OracleDataSource;
import java.sql.SQLException;
import javax.sql.DataSource;

@Configuration
@ConfigurationProperties("spring.datasource")
public class DataSourceDbConfig {
    @Value("${spring.datasource.url}")
    private String dbUrl;
        
    @Value("${spring.datasource.username}")
    private String dbUser;
        
    @Value("${spring.datasource.secure}")
    private String dbPasswrd;
    
    @Bean
    public DataSource dataSource() {
        OracleDataSource dataSource = null;
        try {
            dataSource = new OracleDataSource();
            dataSource.setUser(dbUser);
            dataSource.setPassword(dbPasswrd);
            dataSource.setURL(dbUrl);
            System.out.println("Connection established !!");
        } catch (SQLException e) {
            System.out.println("An issue occured while establishing connection !!");
            e.printStackTrace();
        }
        return dataSource;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-08-18 20:45:39

使用@

  • DataSourceDbConfig --使用@Configuration包括@Component,这样您就可以摆脱它
  • ApplicationRun --我将保持它的简单性并删除

代码语言:javascript
运行
复制
@SpringBootApplication
public class ApplicationRun {
    
    public static void main(String[] args) {
        ApplicationContext appContext = SpringApplication.run(ApplicationRun.class, args);

        // Getting datasource from application context.
        DataSource dataSource = appContext.getBean(DataSource.class);
    
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63475961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档