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

2022-09-02 10:12:35

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

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

当我尝试在部门内部自动连接用户.java实例时.java,我得到以下错误

我不能@Autowire一个存在于依赖库罐中的豆子吗?

无法自动连接字段:专用通信。用户用户;嵌套的例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualify bean type [com.User])找到依赖关系:预计至少有 1 个 bean 有资格作为此依赖关系的自动连接候选项。Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

没有符合条件的 [com.User])找到依赖关系:预计至少有 1 个 bean 有资格作为此依赖关系的自动连接候选项。Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}**

这是弹簧启动应用程序“Y”中的代码

package myapp;

@Component
public class Department {

    @Autowired
    private com.User user;

    //has getter setters for user

}

下面是库 x 中 User.java 的代码.jar

 package com;

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

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

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

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

这是应用程序“Y”中的主类

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

部门和用户都属于不同的包。

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

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

package com
@Configuration
@ComponentScan
public class XConfiguration {

}

步骤 2:在 Y 项目的主类中导入此配置类

@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

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

你可以强迫Spring查看其他软件包,如下所示:

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

答案 2

推荐