我在同一个项目中有两个AWS帐户。在一个帐户中,我有一个需要访问的DynamoDB数据库。在另一个,我有亚马逊Kinesis。为了正确运行kinesis生产者和消费者,我需要定义三个bean:一个用于kinesis,另一个用于Cloudwatch,最后一个用于Dynamo。
@Bean
public AmazonKinesisAsync amazonKinesisAsync() {
}
@Bean
public AmazonDynamoDBAsync amazonDynamoDBAsync() {
}
@Bean
public AmazonCloudWatchAsync amazonCloudwatchAsync() {
}
这很好。问题是AmazonDynamoDBAsync
扩展了AmazonDynamoDB
,并且我在项目中设置了另一个AmazonDynamoDB
bean(以便访问另一个帐户(。这显然会导致以下错误:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.amazonaws.services.dynamodbv2.AmazonDynamoDB' available: expected single matching bean but found 2: amazonDynamoDBAsync,amazonDynamoDB
32
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.20.jar!/:5.3.20]
我不知道如何指定给spring-cloud-stream
或spring-cloud-stream-binder-kinesis
它应该使用哪个bean。我希望能够仅使用@Qualifier
。我广泛阅读了文档,通过配置或代码搜索指定bean的方法,但一无所获。我还尝试删除AmazonDynamoDBAsync
bean,以迫使Kinesis使用另一个帐户上DynamoDB的现有bean,但似乎如果我不指定AmazonDynamoDBAsync
bean,spring-cloud-stream
会尝试创建自己的bean,但我仍然得到NoUniqueBeanDefinitionException
。
关于如何指定spring-cloud-stream
应该使用哪个Bean,有什么线索吗?不幸的是,我不能逃避使用两个AWS帐户。我的POM:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kinesis</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
<version>3.2.5</version>
</dependency>
最后,在AmazonDynamoDBAsync
上简单地使用@Primary
就成功了。然而,我还犯了一些其他错误。对于任何有相同或类似问题的人,我不建议在同一项目中使用两个使用相同SDK的Dynamo bean,这只会让你头疼。如果可以的话,最好不要有一个以上的豆子。如果你不能逃避,拥有两个SDK可以帮助我组织"谁是谁"。最后我停止使用spring-cloud-stream
,转而使用KCL 2.X
。因此,对于不同的AWS SDK实现(另一个Dynamo使用的是SDK 1.X(,我没有更多的冲突。