Spring Boot OAuth2启动报String转OAuth2ClientProperties$Provider转换器缺失错误
报错原因
该报错核心触发点共两个,按启动时的报错优先级排序:
application.yaml配置结构不符合Spring Security OAuth2客户端的自动配置规则:Spring Boot自动配置绑定spring.security.oauth2.client.provider节点时,要求该节点下第一层key为自定义Provider ID(字符串类型),第二层才是authorization-uri、token-uri这类Provider属性,对应绑定的数据结构是Map<String, OAuth2ClientProperties.Provider>。当前配置直接把authorization-uri、token-uri作为provider节点的第一层key,Spring会把authorization-uri识别为Provider ID,尝试将其对应的字符串类型URI值转换为OAuth2ClientProperties.Provider配置对象,找不到对应类型转换器就抛出了所见异常。- 代码存在隐性配置不匹配问题:
WebClient的OAuth2过滤器中设置的默认客户端注册ID为MarvelGuru,和实际构建ClientRegistration时使用的IDIdOfMyApp不一致,即便解决启动报错,运行时也会抛出找不到客户端注册信息的异常。此外手动通过@Value读取配置拼接ClientRegistration的写法,和Spring Boot自动配置逻辑存在冲突,只要yaml内OAuth2客户端配置结构不符合规则,就会先触发自动配置绑定失败。
修复方案
二选一即可,优先选择方案1,更符合Spring Boot约定,减少冗余代码:
方案1:使用Spring Boot自动配置,删除手动注册ClientRegistration的冗余代码
- 修正
application.yaml配置结构,给自定义Provider设置唯一ID,让registration节点通过ID关联对应Provider,正确配置示例如下:
spring: security: oauth2: client: registration: IdOfMyApp: provider: my-custom-provider # 填写下方自定义的Provider ID,不要直接写服务地址 client-id: [my id here] client-secret: [my secret here] client-authentication-method: basic authorization-grant-type: authorization_code scope: - pr.pro - pr.act - openid - offline redirect-uri: https://my.domain.com/fallback client-name: My App Name provider: my-custom-provider: # 自定义Provider ID,需和上方registration内的provider字段值完全一致 authorization-uri: https://api.provider.guys.com/oauth2/auth token-uri: https://api.provider.guys.com/oauth2/token issuer-uri: https://api.provider.guys.com resourceserver: jwt: issuer-uri: https://api.provider.guys.com logging: level: '[org.springframework.web]': DEBUG
- 删除配置类中手动注册
ReactiveClientRegistrationRepository的Bean方法,Spring Boot会自动根据yaml配置生成该实例,无需手动拼接ClientRegistration。 - 修正
WebClient配置中的默认客户端ID,将oauth.setDefaultClientRegistrationId("MarvelGuru")修改为oauth.setDefaultClientRegistrationId("IdOfMyApp"),和yaml中配置的registration ID保持一致。
方案2:保留手动构建ClientRegistration的逻辑,移除冲突的自动配置触发项
如果确实需要手动控制ClientRegistration构建逻辑,按以下步骤修改:
- 删除
application.yaml中spring.security.oauth2.client下所有registration、provider配置,避免Spring Boot自动配置尝试绑定结构异常的属性。 - 将代码中所有
@Value读取的配置路径改为自定义配置key(不要使用Spring OAuth2自动配置保留的spring.security.oauth2.client.*路径),例如将${spring.security.oauth2.client.provider.token-uri}改为${my-app.oauth2.token-uri}这类自定义路径,同时在yaml中对应位置添加这些自定义配置项。 - 修正
WebClient配置中的默认客户端ID,将MarvelGuru改为IdOfMyApp,和手动构建ClientRegistration时使用的registration ID保持一致。
内容的提问来源于stack exchange,提问作者LosmiNCL
相关产品推荐
相关产品推荐

