ConfigurationProperties не связывает свойства в сочетании с явным классом конфигурации имитации.

Я хочу автоматически связать свойства из 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

person d3rbastl3r    schedule 18.07.2018    source источник
comment
То, что вы описали, должно работать без необходимости использования отдельного класса конфигурации. Что-то, что вы не описали, должно быть причиной проблемы. Можете ли вы поделиться минимальным, полным и поддающимся проверке примером, воспроизводящим это?   -  person Andy Wilkinson    schedule 18.07.2018
comment
По запросу мы создали пример проекта, который иллюстрирует проблему. Смотрите редактирование поста от 23.07 :)   -  person d3rbastl3r    schedule 24.07.2018
comment
Столкнулся с этой же проблемой и разделил классы конфигурации, и это сработало. Совсем не идеально и определенно еще одна сломанная вещь в Spring, но она работает.   -  person Mark Murfin    schedule 30.10.2019
comment
У меня точно такая же проблема. Кажется, FeignConfiguration не работает с ConfigurationProperties   -  person Kevin    schedule 17.04.2020