首页 > 解决方案 > 无法使用 @Qualifier 注入 bean

问题描述

我有一个用例,我正在使用执行器服务创建两个不同的线程池。一个以前存在,我正在创建一个新的。

我们有一个 Java 配置文件,其中定义了所有 bean。我创建了命名bean (@Bean (name = "ExecutorService")@Bean (name = "ExecutorServiceEx"))如下所示:

package com.amazon.procurementservice.spring;

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;

import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn;

import com.amazon.procurementservice.util.OpenPOItemsUtil; import com.amazon.procurementservice.util.POHeadersUtil; import com.amazon.procurementservice.util.POItemsUtil; import com.amazon.procurementviews.accesors.DynamoDBAccessor; import com.amazon.procurementviews.repositories.OpenPOItemRepository; import com.amazon.procurementviews.repositories.POHeaderRepository; import com.amazon.procurementviews.repositories.POItemRepository; import com.amazon.procurementviews.repositories.dynamodb.DynamoDBOpenPOItemRepository; import com.amazon.procurementviews.repositories.dynamodb.DynamoDBPOHeaderRepository; import com.amazon.procurementviews.repositories.dynamodb.DynamoDBPOItemRepository; import com.amazon.procurementviews.spring.ProcurementViewCommonConfig; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;

import amazon.odin.awsauth.OdinAWSCredentialsProvider;

@Configuration
@DependsOn("EnvironmentHelper")
public class ProcurementViewDynamoDbConfig extends ProcurementViewCommonConfig {

    @Value("${ProcurementService.ProcurementSecondaryViews.DynamoDB.materialName}")
    private String materialNameViews;

    @Value("${ProcurementService.ProcurementSecondaryViews.DynamoDB.awsRegion}")
    private String awsRegionViews;

    @Value("${ProcurementService.DynamoDB.getPurchaseOrderItems.threadCount}")
    private int threadCount;

    @Value("${ProcurementService.DynamoDB.getPurchaseOrderItemExs.threadCount}")
    private int threadCountEx;

    /**
     * Beans for repositories
     */
    @Bean
    POHeaderRepository poHeaderRepository() {
        return new DynamoDBPOHeaderRepository(secondaryViewsViewAccessor(), fnSkuListS3Handler());
    }

    @Bean
    POItemRepository poItemRepository() {
        return new DynamoDBPOItemRepository(secondaryViewsViewAccessor());
    }

    @Bean
    OpenPOItemRepository openPoItemRepository() {
        return new DynamoDBOpenPOItemRepository(secondaryViewsViewAccessor());
    }

    @Bean
    DynamoDBAccessor secondaryViewsViewAccessor() {
        return new DynamoDBAccessor(secondaryViewsDynamoDBClient(), secondaryViewsDynamoDBMapper());
    }

    @Bean
    DynamoDBMapper secondaryViewsDynamoDBMapper() {
        return new DynamoDBMapper(secondaryViewsDynamoDBClient());
    }

    @Bean
    AmazonDynamoDB secondaryViewsDynamoDBClient() {
        final AmazonDynamoDB client =
                AmazonDynamoDBClientBuilder.standard().withCredentials(new OdinAWSCredentialsProvider(materialNameViews)).withRegion(awsRegionViews).build();

        return client;
    }

    @Bean(name = "ExecutorService")
    ExecutorService threadPool() {
        return Executors.newFixedThreadPool(threadCount);
    }

    @Bean(name = "ExecutorServiceEx")
    ExecutorService threadPoolEx() {
        return Executors.newFixedThreadPool(threadCountEx);
    }

    @Bean
    POItemsUtil poItemsUtil() {
        return new POItemsUtil(poItemRepository(), threadPool());
    }

    @Bean
    OpenPOItemsUtil openPOItemsUtil() {
        return new OpenPOItemsUtil(openPoItemRepository(), threadPool());
    }

    @Bean
    POHeadersUtil poHeadersUtil() {
        return new POHeadersUtil(poHeaderRepository(), threadPool());
    }
}

我在另一个文件中使用它们,@Autowired如下@Qualifier所示:

 @Autowired
    @Qualifier("ExecutorServiceEx")
    private final ExecutorService executorServiceEx;

但我得到如下异常:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.amazon.procurementservice.activities.GetPurchaseOrderItemExsActivity': Unsatisfied dependency expressed through constructor parameter 0;
        nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.util.concurrent.ExecutorService' available: expected single matching bean but found 2: ExecutorService,ExecutorServiceEx
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1198) ~[spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]

我试过了@Resource,但结果是一样的。我也尝试添加<context:annotation-config/>application-config.xml没有运气

<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-4.0.xsd
        http://www.springframework.org/schema/util classpath:org/springframework/beans/factory/xml/spring-util-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

    <!--  The main application context spring configuration -->
    <import resource="application/environment.xml" />
    <import resource="application/http-server.xml" />
    <import resource="application/coral-throttle.xml" />
    <import resource="application/service-chain.xml" />
    <import resource="common/health-check.xml" />
    <import resource="common/hibernate.xml" />
    <import resource="common/dao-definitions.xml" />
    <import resource="application/hibernate.xml" />
    <import resource="common/procurement-infrastructure.xml" />
    <import resource="common/procurement-common.xml" />
    <!--
        Add any beans specific to your application here
    -->
    <bean class="com.amazon.procurementservice.spring.AuditHistoryConfig" />
    <bean class="com.amazon.procurementservice.spring.OpenPOItemConfig" />
    <bean class="com.amazon.procurementservice.spring.ProcurementViewDynamoDbConfig" />
    <bean class="com.amazon.procurementservice.spring.ProcurementViewElasticSearchConfig" />
    <bean class="com.amazon.procurementservice.spring.AmazonProfilingConfig" />
    <bean class="com.amazon.procurementservice.spring.MetricsConfig" />
    <bean class="com.amazon.procurementservice.spring.POServiceConfig" />
    <bean class="com.amazon.procurementservice.spring.ApplicationBean" />
</beans>

请帮助识别并解决此问题。

标签: springspring-mvcjavabeans

解决方案


推荐阅读