[英]No qualifying bean of type when using @ConditionalOnProperty
[英]Parameter 0 of constructor when using @ConditionalOnProperty
我正在使用 AWS SES 編寫發送 email 服務。 我加一個
@conditionalOnProperty
在此服務上以控制它是否有效。
@Configuration
@RequiredArgsConstructor
public class MailConfig {
private final SystemParam systemParam;
@Bean
@ConditionalOnProperty(name = "system-param.aws-active",havingValue = "true")
public AmazonSimpleEmailService amazonSimpleEmailService() {
String awsAccessKey = systemParam.getAWS_ACCESS_KEY();
String awsSecretKey = systemParam.getAWS_SECRET_KEY();
return AmazonSimpleEmailServiceClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(
new BasicAWSCredentials(
awsAccessKey,awsSecretKey)))
.withRegion(Regions.AP_SOUTHEAST_2)
.build();
}
}
當我不想注入它時,我會將 aws-active 設置為 false。 但是運行應用程序的時候,會報錯:
Description:
Parameter 0 of constructor in com.eta.houzezbackend.service.EmailService required a bean of type 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService' that could not be found.
Action:
Consider defining a bean of type 'com.amazonaws.services.simpleemail.AmazonSimpleEmailService' in your configuration.
我知道這是因為我的其他使用 AmazonSimpleEmailService 的類需要注入它:
public record EmailService(AmazonSimpleEmailService amazonSimpleEmailService, SystemParam systemParam) {
...
}
但是,如果我不想將其注冊為 bean,該如何處理呢?
期待您的建議!
你有兩個選擇:
但是,使用條件 bean 的最佳方式是通過 inheritance:幾個實現通用接口的具體服務。 然后你使自動裝配成為可選的,或者你設置你的條件以便總是有一個加載的 bean。
簡短示例:
public interface ProducerService {
...
}
@ConditionalOnProperty(name="xxx", value="true")
public class Producer1Service implements ProducerService {
...
}
@ConditionalOnProperty(name="xxx", value="false")
public class Producer2Service implements ProducerService {
...
}
public class ConsumerService {
@Autowired private ProducerService producerService;
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.