ConfigurationProperties不会将属性与显式的伪装配置类结合使用

时间:2018-07-18 12:33:04

标签: java spring spring-boot spring-cloud spring-cloud-feign

我想通过在bean上使用@ConfigurationProperties来自动绑定来自application.yml的属性,但是不会注入该属性。

我的问题似乎类似于ConfigurationProperties does not bind properties,但该帖子中的解决方案对我不起作用。

我的设置如下:

application.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-Method中设置一个断点并查找resourceDetails-Properties,则所有这些都为空。如果使用@Value批注,则正确设置值。 在KeycloakFeignClientConfiguration-Class上添加@Configuration注释没有区别。

KeycloakProxy.java

@FeignClient(name ="noName", url = "http://${keycloak.host}:${keycloak.port}/auth", configuration = KeycloakFeignClientConfiguration.class)
public interface KeycloakProxy {

    // ...some request mappings
}

我们必须指定一个显式的配置类,因为否则此代理将使用错误的配置类。该项目包含多个伪客户端配置类。

ServiceApplication.java

@EnableDiscoveryClient
@EnableFeignClients
@EnableTransactionManagement
@SpringBootApplication
public class ServiceApplication {
    public static void main(String[] args) {
        Validate.notNull(args, "args");
        SpringApplication.run(ServiceApplication.class, args);
    }
}

向ServiceApplication添加@EnableConfigurationProperties也没有区别。如果我添加@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(在正确的应用程序上下文中?)并注入属性。在这里,我将在KeycloakFeignClientConfiguration.java中的oauth2FeignRequestInterceptor-Method内部获得整个配置的resourceDetails

我想避免创建其他配置类来创建资源详细信息bean。您有解决此问题的想法吗?

编辑23.07.2018

根据要求,我们创建了一个示例项目来说明问题:Link to GitHub-Project

  • 要运行测试,需要Docker,因为我们使用Testcontainers。
  • KeycloakProxy被命名为(在测试项目中)ExampleFeignClient

0 个答案:

没有答案