Я хочу автоматически связать свойства из application.yml с помощью @ConfigurationProperties в bean-компоненте, но свойства не будут внедрены.
Моя проблема похожа на ConfigurationProperties не связывает свойства, но решения в этом сообщении не т работать на меня.
Моя установка выглядит следующим образом:
приложение.yml
keycloak:
host: localhost
port: 8085
security:
oauth2:
client:
clientId: admin-cli
username: admin
password: secret
accessTokenUri: http://${keycloak.host}:${keycloak.port}/auth/realms/master/protocol/openid-connect/token
clientAuthenticationScheme: form
KeycloakFeignClientConfiguration.java
public class KeycloakFeignClientConfiguration {
@Value("${security.oauth2.client.clientId}")
private String clientId;
@Bean
@ConfigurationProperties("security.oauth2.client")
public ResourceOwnerPasswordResourceDetails resourceDetails() {
// ResourceOwnerPasswordResourceDetails comes from org.springframework.security
return new ResourceOwnerPasswordResourceDetails();
}
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor(ResourceOwnerPasswordResourceDetails resourceDetails) {
return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), resourceDetails);
}
}
Если я устанавливаю точку останова в методе oauth2FeignRequestInterceptor и ищу resourceDetails-Properties, все они равны нулю. В случае аннотации @Value значение установлено правильно. Добавление аннотации @Configuration в класс KeycloakFeignClientConfiguration не имеет значения.
KeycloakProxy.java
@FeignClient(name ="noName", url = "http://${keycloak.host}:${keycloak.port}/auth", configuration = KeycloakFeignClientConfiguration.class)
public interface KeycloakProxy {
// ...some request mappings
}
Мы должны указать явный класс конфигурации, потому что в противном случае для этого прокси будет использоваться неправильный класс конфигурации. Проект содержит несколько классов конфигурации клиента feign).
ServiceApplication.java
@EnableDiscoveryClient
@EnableFeignClients
@EnableTransactionManagement
@SpringBootApplication
public class ServiceApplication {
public static void main(String[] args) {
Validate.notNull(args, "args");
SpringApplication.run(ServiceApplication.class, args);
}
}
Добавление @EnableConfigurationProperties в ServiceApplication также не имеет значения. Если я добавлю @EnableConfigurationProperties(KeycloakFeignClientConfiguration.class) или @EnableConfigurationProperties(ResourceOwnerPasswordResourceDetails.class), я получаю исключение, в котором говорится, что классы не имеют @ConfigurationProperties.
Caused by: java.lang.IllegalArgumentException: No ConfigurationProperties annotation found on 'com.gbtec.bic.cloud.tenant.remote.keycloak.KeycloakFeignClientConfiguration'.
Что работает для меня, так это то, что я перемещаю resourceDetails-Method из KeycloakFeignClientConfiguration в дополнительный класс конфигурации и аннотирую их с помощью @Configuration. Например:
@Configuration
public class ServiceConfiguration {
@Bean
@ConfigurationProperties("security.oauth2.client")
public ResourceOwnerPasswordResourceDetails resourceDetails() {
return new ResourceOwnerPasswordResourceDetails();
}
}
Таким образом будет создан bean-компонент (в правильном контексте приложения?) и будут внедрены свойства. Здесь я получу resourceDetails со всей конфигурацией внутри oauth2FeignRequestInterceptor-Method в KeycloakFeignClientConfiguration.java.
Я хочу избежать создания дополнительного класса конфигурации для создания bean-компонента сведений о ресурсах. У вас есть идеи по решению этой проблемы?
Изменить 23.07.2018
По запросу мы создали пример проекта, иллюстрирующий проблему: Ссылка на проект GitHub
- Для запуска теста требуется Docker, потому что мы используем Testcontainers.
- KeycloakProxy называется (в тестовом проекте) ExampleFeignClient