我正在尝试保留一个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。
答案 0 :(得分:2)
Lombok的@RequiredArgsConstructor
和onConstructor
选项不适用于带注释的依赖项注入。在这种情况下,您需要显式编写一个构造函数。
答案 1 :(得分:1)
您在SNSModule中映射和绑定的配置看起来正确。
由于您尚未发布主应用程序类代码。 我怀疑您可能错过了在SNSModule上创建注射器的方法。在main-application-class中添加以下行:
Injector injector = Guice.createInjector(SNSModule);
答案 2 :(得分:1)
解决方案非常棘手,以下示例项目对我有用。
龙目岛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文件,请参见here
在文件中添加以下行
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注入所有构造函数参数。
答案 3 :(得分:0)
默认情况下,Lombok 不会将字段上的任何注释复制到构造函数参数。如果您想继续使用 @RequiredArgsConstructor(access = AccessLevel.PUBLIC, onConstructor = @__(@Inject))
,请在 lombok.config 文件中添加相同的配置,如下所示:
lombok.copyableAnnotations += com.google.inject.name.Named