简体   繁体   中英

Parameter 0 of constructor when using @ConditionalOnProperty

I'm writing a send email service with AWS SES. I add a

@conditionalOnProperty 

on this service to control whether it works or not.

@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();
    }

}

When I do not want to inject it, I will set the aws-active to false. But when running the application, the error will come out:

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.

I understand that is because my other classes which use the AmazonSimpleEmailService will need it to be injected:

public record EmailService(AmazonSimpleEmailService amazonSimpleEmailService, SystemParam systemParam) {
...
}

But how to I deal with this if I do not want it to be registered as bean?

Looking forward to your suggestions!

You have two options:

  • Pass required to false in @Autowired annotation
  • Make your EmailService conditional as well

However, the best way to use conditional beans is via inheritance: several concrete services implementing a common interface. Then you make the autowire optional, or you put your conditions so that there is always one loaded bean.

Short example:

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;
  ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM