sunmingtao / sample-code

3 stars 4 forks source link

Cannot autowire: required a single bean, but 2 were found #235

Closed sunmingtao closed 3 years ago

sunmingtao commented 3 years ago

Constructor based injection

@Autowired
public KeycloakService(final KeycloakConfiguration keycloakConfiguration) {
    this.keycloakConfiguration = keycloakConfiguration;
}

sees the error:

Parameter 0 of constructor in au.gov.nla.ums.migrator.service.KeycloakService required a single bean, but 2 were found:
    - keycloakConfig: defined in file [D:\workspace\ums-migrator\target\classes\au\gov\nla\ums\migrator\config\KeycloakConfiguration.class]
    - shireConfig: defined in file [D:\workspace\ums-migrator\target\classes\au\gov\nla\ums\migrator\config\ShireConfiguration.class]
sunmingtao commented 3 years ago

Solution 1 (magic): Change the argument name to keycloakConfig to match the component name

@Autowired
public KeycloakService(final KeycloakConfiguration keycloakConfig) {
    this.keycloakConfiguration = keycloakConfig;
}
@Component(value = "keycloakConfig")
public class KeycloakConfiguration {
 ...
}

Solution 2: (formal) Add a qualifier

@Autowired
public KeycloakService(@Qualifier("keycloakConfig") final KeycloakConfiguration keycloakConfiguration) {
    this.keycloakConfiguration = keycloakConfiguration;
}