Q: NoUniqueBeanDefinitionException: No qualifying bean of type 'AppProperties' available: expected single matching bean but found 3 I am trying to load the api key value from the application.properties file and below are the class files. I am unable to start the application as it is not able to find the unique bean. Not sure what i am missing. Can someone please help.
This is our AppProperties.java
@Component
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = AppProperties.APP_PROPERTIES_PREFIX)
public class AppProperties {

    public static final String APP_PROPERTIES_PREFIX = "bi";

    private String accessTokenUri;
    private String clientId;
    private String clientSecret;
    private String basicAuth;
    private String apiKey;
    //getters and setters
    }
    

This is our DiagnosticProperties.java
@Component
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "bi")
public class DiagnosticProperties extends AppProperties {
    private String diagnosisUrl;
//getters and setters 
}

This is our ObservationProperties.java
@Component
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "bi")
public class ObservationProperties extends AppProperties {
    private String observationUrl;
//getters and setters
}

This is our DiagnosticServiceImpl.java
@Service
public class DiagnosticServiceImpl implements DiagnosticService {
    private static final Logger LOGGER = 
          LoggerFactory.getLogger(ObservationServiceImpl.class);

    private final WebClient webClient;
    private final DiagnosticProperties diagnosticProperties;

    public DiagnosticServiceImpl(final WebClient webClient,final DiagnosticProperties 
                  diagnosticProperties) {
        this.webClient = webClient;
        this.diagnosticProperties = diagnosticProperties;
    }

    @Override
    public Mono<DiagnosticResponse> getPatientDiagnosticDetails(final String uri) {
        return diagnosticDetails(uri);
    }


A: You should not put any annotations on the AppProperties (that could have been an abstract class). The classes that inherit from it only need @ConfigurationProperties(prefix = "..") and @Component or they could be also enabled with @EnableConfigurationProperties from another configuration class.
When you inject - be specific about which configuration properties you want to inject - either by specifying a type - like you did in your example, or by adding @Qualifier("bean-name") to the parameter on the injection point.
Spring Boot out-of-the-box configures application.properties property source.
