当前位置: 首页 > 知识库问答 >
问题:

Spring应用程序上下文有我的bean,但@autowired没有看到它

姬锐
2023-03-14

我正在尝试用注释配置我的Spring Boot应用程序,并在其中使用@Autowired注释。当我检查是否已加载Bean时,它已加载,但使用@Autowired时,它会显示NoSuchBeanDefinitionException

正如您可以进一步看到的那样,我试图检查我的Bean是否真的被加载了,所以当我运行我的应用程序时,我可以在控制台中看到我的Bean的名称。此外,我尝试将“scanBasePackages="com.log.iei.Logistic a"添加到我的@SpringBootApplication注释中,但它什么也没改变。此外,我尝试了字段自动装配

这是我的主要课程:

@SpringBootApplication(scanBasePackages = "com.log.iei.Logistica")
public class LogisticaApplication extends Application {
   public static ConfigurableApplicationContext context;

   @Override
   public void init() throws Exception {
       SpringApplicationBuilder builder = new SpringApplicationBuilder(AppConfig.class);
       context = builder.run(getParameters().getRaw().toArray(new String[0]));
       String[] beanNames = context.getBeanDefinitionNames();
       Arrays.sort(beanNames);
       for (String beanName : beanNames) {
           System.out.println(beanName);
       }

   }

以下是车辆服务等级的一部分:

@Component("vehicleService")
public class VehicleService implements IDao<VehicleEntity> {

    private static VehicleService vehicleService;
    GenericDao<VehicleEntity> dao;

    public VehicleService(){
        dao = new GenericDao<>(VehicleEntity.class);
        System.out.println("==== VehicleService was created ====");
    }

以下是@自动连线部分的一部分:

@Component("cargoPage")
public class CargoPage extends TablePageTemplate {

    @Autowired
    public CargoPage(VehicleService vehicleService){
        getAboveTableLine().getChildren().addAll(getAboveTableLineSetup());

        setTable(getTable(), vehicleService.findAll(), VehicleEntity.getTableMapping());

这里有一个错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.log.iei.Logistica.data.controllers.Services.VehicleService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1654)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1213)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
    ... 24 more

UPD:可能问题在于VehicleService实现了通用接口。

共有2个答案

鄢翰藻
2023-03-14

您应该检查您的文件是否在基本包中。例如,如果您有:

com.log
       .service
               VehicleService.java
               CargoPage.java
       LogisticaAplication.java

因此,在您的Logistic aApplication.java中,您应该将底座添加为以下内容:

@SpringBootApplication(scanBasePackages = "com.log")
public class LogisticaApplication extends Application {
   public static ConfigurableApplicationContext context;

   @Override
   public void init() throws Exception {
       SpringApplicationBuilder builder = new SpringApplicationBuilder(AppConfig.class);
       context = builder.run(getParameters().getRaw().toArray(new String[0]));
       String[] beanNames = context.getBeanDefinitionNames();
       Arrays.sort(beanNames);
       for (String beanName : beanNames) {
           System.out.println(beanName);
       }

   }
陶高峻
2023-03-14

首先,您必须将基本包设置为:

@SpringBootApplication(scanBasePackages = "com.log")

您正确地映射了所有内容,但是,用于Autowire bean的构造函数不应该调用任何其他逻辑。如果您需要在bean初始化之后立即执行某些操作,请使用PostConstruct。

您的代码是这样的:

@Service
public class CargoPage extends TablePageTemplate {

    private VehicleService vehicleService;

    @Autowired
    public CargoPage(VehicleService vehicleService) {
        this.vehicleService = vehicleService;
    }

    @PostConstruct
    public void init() {
        getAboveTableLine().getChildren().addAll(getAboveTableLineSetup());
        setTable(getTable(), vehicleService.findAll(), VehicleEntity.getTableMapping());
    }
}
 类似资料:
  • AndroidJavaException:>io.Fabric.unity.Android.FabricInitializationException:Fabric未找到有效的应用程序上下文。?12-13 00:13:28.758 244 77 245 16 E Unity:io.Fabric.Unity.android.FabricInitializationException:Fabric未找

  • 几个小时前,我打开了一个问题,它被标记为重复,但是它不是标记问题的重复。 从那以后,我设法完成了一些事情,解决了一些问题,所以我的问题是: 我试图将一个Springbean自动连接到另一个,但是我的问题是@自动连接字段总是空的,这说明它们都是受管理的bean,并且自己可以正确工作。 我发现,通过实现ApplicationContextAware接口,可以在bean中访问ApplicationCon

  • 我试图并行处理Spring批处理作业中的一些步骤。作业的XML配置如下:

  • 问题内容: 我正在编写一个实现以下方法的类: 在这种方法中,我希望使用类似于以下内容的配置文件来构造Spring应用程序上下文: 是否可以在配置文件中引用“ dataSource” bean的任何地方强制Spring使用传递给我的方法的DataSource对象? 问题答案: 我发现两个Spring接口可以用来实现我所需要的。该BeanNameAware接口允许Spring通过调用来告诉一个对象的应

  • 只是在Spring4.3中从基于xml的配置迁移到基于java的配置。 另外,我尽量不在所有类的所有字段中添加@Autowired注释。这太多了,无法改变。 我现在的问题是:如何通过名称告诉组件扫描到autowire found bean?