customizing/overriding ClientRegistrationRepository 时无法从 application.yml 读取属性
Unable to read properties from application.yml while customizing/overriding ClientRegistrationRepository
我正在尝试实现本文档中提到的自定义客户端存储库。
根据文档,属性是硬编码在代码中的,我正在尝试从 application.yml 中读取这些属性。但是,当需要设置时,属性不可用。
请问这个怎么实现?如何在此处提供 application.yml 属性。
Application.yml:
sso:
enabled: true
registrationId: myApp
clientName: myApp
.....
POJO对应sso属性
@Data
@ConfigurationProperties("sso")
public class SsoPropertiesConfig {
private boolean enabled;
private String clientName;
private String registrationId;
....
网络安全配置
@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();
private final PasswordResolver passwordResolver;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(this.myClientRegistration());
}
private ClientRegistration myClientRegistration() {
log.info("ssoPropertiesConfig :{}",ssoPropertiesConfig);
// all properties of ssoPropertiesConfig are coming as NULL
return ClientRegistration.withRegistrationId(ssoPropertiesConfig.getRegistrationId())
.clientName(ssoPropertiesConfig.getClientName())
....
.build();
}
}
您正在使用 new
自己创建属性,而不是让 spring 使用依赖注入管理它们。
您的代码:
SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();
您可以删除 new
声明,因为您已经用 @RequiredArgsConstructor
注释了 class
所以只保留:
private SsoPropertiesConfig ssoPropertiesConfig;
您需要将 SsoPropertiesConfig 注入到您想要使用它的地方,而是像 POJO 一样创建它,而不是 Spring bean。
您可以像这样使用@Autowired 注释
@Autowired
SsoPropertiesConfig ssoPropertiesConfig;
或者只要你有一个需要参数的构造函数,你就可以将它作为最终字段:
private final SsoPropertiesConfig ssoPropertiesConfig;
注意:必须使用final。
我正在尝试实现本文档中提到的自定义客户端存储库。
根据文档,属性是硬编码在代码中的,我正在尝试从 application.yml 中读取这些属性。但是,当需要设置时,属性不可用。
请问这个怎么实现?如何在此处提供 application.yml 属性。
Application.yml:
sso:
enabled: true
registrationId: myApp
clientName: myApp
.....
POJO对应sso属性
@Data
@ConfigurationProperties("sso")
public class SsoPropertiesConfig {
private boolean enabled;
private String clientName;
private String registrationId;
....
网络安全配置
@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();
private final PasswordResolver passwordResolver;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(this.myClientRegistration());
}
private ClientRegistration myClientRegistration() {
log.info("ssoPropertiesConfig :{}",ssoPropertiesConfig);
// all properties of ssoPropertiesConfig are coming as NULL
return ClientRegistration.withRegistrationId(ssoPropertiesConfig.getRegistrationId())
.clientName(ssoPropertiesConfig.getClientName())
....
.build();
}
}
您正在使用 new
自己创建属性,而不是让 spring 使用依赖注入管理它们。
您的代码:
SsoPropertiesConfig ssoPropertiesConfig = new SsoPropertiesConfig();
您可以删除 new
声明,因为您已经用 @RequiredArgsConstructor
所以只保留:
private SsoPropertiesConfig ssoPropertiesConfig;
您需要将 SsoPropertiesConfig 注入到您想要使用它的地方,而是像 POJO 一样创建它,而不是 Spring bean。
您可以像这样使用@Autowired 注释
@Autowired
SsoPropertiesConfig ssoPropertiesConfig;
或者只要你有一个需要参数的构造函数,你就可以将它作为最终字段:
private final SsoPropertiesConfig ssoPropertiesConfig;
注意:必须使用final。