NoSuchBeanDefinitionException:没有可用的合格Bean类型:期望至少有1个有资格作为自动装配候选者的bean

时间:2018-07-17 15:08:15

标签: java spring spring-boot autowired external-dependencies

我正在尝试将Spring 4.x.x迁移到Spring引导,并且它依赖于外部spring 2.5 jar中的类。我已经进行了所有自动装配更改,下面是我的应用程序类

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages = { "com.xyz" })
public class MainApiApplication {

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

外部jar中的依赖类位于com.xyz.abc包下,因为我将主应用程序类放在com.xyz包下,并且还在同一包下添加了组件扫描。

这是我的具有自动关联依赖项的组件类

@Component
public class ComponentClassA {
    @Autowired
    private ComponentClassB currencyService;
}

@Component
public class ComponentClassB {

    @Autowired
    private DependentClass depClass;
}

DependentClass是我本地已附加并构建的外部依赖jar中存在的类

构建应用程序时,所有文件的编译都很好,并且生成成功。但是当我启动应用程序时,出现以下错误

 Field DependentClass in com.xyz.ComponentClassB required a bean of type 'com.xyz.common.util.DependentClass' that could not be found.

我不明白从外部jar中找到类的原因,因为我已经添加了对组件的组件扫描

DependentClass的定义如下所示

public class DependentClass extends ResourceClass<Map<String, Double>> {
            // Methods and logic
}

是因为DependentClass扩展了一个类吗?有人可以帮我找出错误的原因吗?

3 个答案:

答案 0 :(得分:2)

DependentClass上没有@Component批注。因此,您需要通过XML或Java配置自己创建DependentClass的bean。

不必将主类与DependentClass放在同一包中。

答案 1 :(得分:1)

根据以下内容定义您的课程:-

     @Component("depClass") 
     public class DependentClass extends ResourceClass<Map<String, Double>> {
            // Methods and logic
      }

如果此包位于您的ScanBasePackages中,并且组件注释中的 depClass 定义了您的bean的名称,则将该组件注册到您的上下文定义中。

您也可以通过以下方式调用它:-

    @Autowired
    @Qualifier("depClass")
    private DependentClass dependentClass;

如果该类在您的外部类中定义,则使用@Bean注释,例如:-

 @Bean
   public DependentClass depClass(){
    return new DependentClass();
   }

在自动连接类之后,您终于获得了实例。

答案 2 :(得分:0)

在当前的Spring Context中未定义DependentClass。DependentClass未使用bean(@Bean)注释。因此,会发生 nosuchbeandefinitionexception

@Bean
public class DependentClass extends ResourceClass<Map<String, Double>> {
            // Methods and logic
}