[英]Guice Configuration Error No implementation was bound
我正在嘗試保留一個單例 AmazonSNS 來訪問 SNS。 我已經為 SNS 編寫了一個模塊(目前只添加了一個 SNS)和一個用於發布消息的訪問器。 我的代碼如下:
public class SNSModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Named("PSSNSRegionName")
private Regions getPSSNSRegionName(
@Named(BeanConstants.P_S_SNS_REGION) final String regionName) {
return Regions.fromName(regionName);
}
@Provides
@Singleton
@Named(BeanConstants.P_S_SNS)
public AmazonSNS getPSSNS(
@NonNull @Named("PaymentSuccessSNSRegionName") final Regions region,
final Config config) {
return AmazonSNSClientBuilder.standard()
.withCredentials(new AWSCredentialsProviderImpl(config.getSnsMaterialSet()))
.withRegion(region)
.build();
}
}
SNS訪問器如下:
@RequiredArgsConstructor(access = AccessLevel.PUBLIC, onConstructor = @__(@Inject))
public class SNSAccessor {
@Named(BeanConstants.P_S_SNS)
private final AmazonSNS snsClient;
private static final String COLON = ":";
private static final short ARN_LENGTH = 6;
public PublishResult publishToSNS(@NonNull final String snsTopicArn, @NonNull final String messageToPublish) {
try {
String[] arnParts = snsTopicArn.split(COLON);
Preconditions.checkArgument(
snsTopicArn.split(COLON).length == ARN_LENGTH,
"Expected arn to have 6 parts but found: " + arnParts.length
);
return snsClient.publish(snsTopicArn, messageToPublish);
} catch (InternalErrorException e) {
log.error("InternalErrorException publishing notification to SNS", e);
throw new RetriableException(e);
} catch (Exception e) {
log.error("Exception publishing notification to SNS", e);
throw new NonRetriableException(e);
}
}
}
我能夠構建包,但它在運行時拋出了 ConfigurationException。
Caused by: com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for com.amazonaws.services.sns.AmazonSNS was bound.
while locating com.amazonaws.services.sns.AmazonSNS
for parameter 0 at com.xyz.service.sns.SNSAccessor.<init>(SNSAccessor.java:29)
你能幫我弄清楚我做錯了什么嗎? 我已經在 main 中正確安裝了 SNSModule。
Lombok 的帶有onConstructor
選項的@RequiredArgsConstructor
不適用於帶注釋的依賴項注入。 您需要為這種情況顯式編寫構造函數。
您在 SNSModule 中映射和綁定的配置看起來是正確的。
由於您尚未發布主應用程序類代碼。 我懷疑您可能錯過了在 SNSModule 上創建注入器的機會。 在 main-application-class 中添加以下幾行:
Injector injector = Guice.createInjector(SNSModule);
解決方案非常棘手,以下在示例項目中對我有用。
龍目島 1.8.4 吉斯 4.2.2
您應該創建自己的注釋並用它替換 @Named 注釋,請參閱BindingAnnotations
例如
package org.company.PSSNS
import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@BindingAnnotation
@Target({PARAMETER,METHOD,FIELD})
@Retention(RUNTIME)
public @interface PSSNS {}
然后添加一個 lombok.config 文件見這里
在文件中添加以下行
lombok.copyableAnnotations += org.company.PSSNS
在你的班級
@RequiredArgsConstructor(access = AccessLevel.PUBLIC, onConstructor = @__(@Inject))
public class SNSAccessor {
@PSSNS
private final AmazonSNS snsClient;
private static final String COLON = ":";
private static final short ARN_LENGTH = 6;
也可以在 Guice 模塊中替換它
public class SNSModule extends AbstractModule {
@Provides
@Singleton
@PSSNS
public AmazonSNS getPSSNS(
@NonNull @Named("PaymentSuccessSNSRegionName") final Regions region,
final Config config) {
return AmazonSNSClientBuilder.standard()
.withCredentials(new AWSCredentialsProviderImpl(config.getSnsMaterialSet()))
.withRegion(region)
.build();
}
}
當我測試我需要從 maven 清理構建時
查看生成的類並驗證您可以在構造函數中看到它。
這應該允許 Guice 注入所有構造函數參數。
默認情況下,Lombok 不會將字段上的任何注釋復制到構造函數參數。 如果您想繼續使用@RequiredArgsConstructor(access = AccessLevel.PUBLIC, onConstructor = @__(@Inject))
,請在 lombok.config 文件中添加相同的配置,如下所示:
lombok.copyableAnnotations += com.google.inject.name.Named
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.