我想通过在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