我不能@Autowire存在于依赖的Library Jar中的Bean吗?

时间:2015-06-12 06:06:47

标签: java spring autowired

我有一个Spring Boot应用程序(Y),它依赖于一组打包为x.jar的库文件,并在应用程序Y的pom.xml中作为依赖项提到。

x.jar有一个名为(User.java)的bean 应用程序Y有一个名为(Department.java)

的java类

当我尝试在Department.java中自动装配User.java的实例时,我收到以下错误

我不能@Autowire一个依赖的Library Jar中存在的Bean吗?

  

无法自动装配字段:private com.User user;嵌套异常是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   为依赖项找到[com.User]类型的限定bean:期望在   至少有1个bean有资格作为autowire候选者   依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

     

找不到[com.User]类型的限定bean用于依赖:expected   至少有一个bean有资格作为autowire候选者   依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)} **

以下是Spring Boot Application'Y'中的代码

package myapp;

@Component
public class Department {

    @Autowired
    private com.User user;

    //has getter setters for user

}

以下是Library x.jar

中User.java的代码
 package com;

@Component
@ConfigurationProperties(prefix = "test.userproperties")
public class User {

  private String name;
  //has getter setters for name    
}

这是x.jar在应用程序Y的pom.xml中的依赖项条目

      <groupId>com.Lib</groupId>
      <artifactId>x</artifactId>
      <version>001</version>
    </dependency>   

这是应用程序'Y'中的Main类

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableZuulProxy
@EnableGemfireSession(maxInactiveIntervalInSeconds=60)
@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableDiscoveryClient
public class ZuulApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
    }
}   

部门和用户都在不同的包裹中。

解决方案:我应用了以下两个步骤,现在自动装配工作正常。

步骤1:在jar文件中添加以下类

package com
@Configuration
@ComponentScan
public class XConfiguration {

}

步骤2:在Y项目的主类

中导入此Configuration类
@Configuration
    @EnableAutoConfiguration
    @ComponentScan
    @EnableZuulProxy
    @EnableGemfireSession(maxInactiveIntervalInSeconds=60)
    @EnableCircuitBreaker
    @EnableHystrixDashboard
    @EnableDiscoveryClient
    @Import(XConfiguration.class) 
    public class ZuulApplication {

        public static void main(String[] args) {
            new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
        }
    }

1 个答案:

答案 0 :(得分:12)

您需要将主类和User类的包名称添加为100%确定,但更可能的是,User类不在主类的相同包(或子包)中。这意味着组件扫描不会拾取它。

您可以强制弹簧查看其他类似的包:

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})