Spring Boot3升级:自定义OpaqueTokenIntrospector未生效,clientId为空
问题根源
自定义OpaqueTokenIntrospector Bean未被Spring优先识别,导致自动配置的OAuth2ResourceServerOpaqueTokenConfiguration依然尝试创建默认的SpringOpaqueTokenIntrospector实例。由于未配置client-id和client-secret,触发clientId cannot be null异常。
尽管自动配置类上有@ConditionalOnMissingBean(OpaqueTokenIntrospector.class)注解,但因为配置了spring.security.oauth2.resourceserver.opaquetoken.introspection-uri,满足@ConditionalOnProperty条件,且自定义Bean加载顺序晚于自动配置,导致自动配置先执行并报错。
解决方案
1. 排除自动配置类
在Spring Boot启动类上添加@SpringBootApplication的exclude属性,彻底阻止自动配置类加载:
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerOpaqueTokenConfiguration; @SpringBootApplication(exclude = OAuth2ResourceServerOpaqueTokenConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
2. 给自定义Bean添加@Primary注解
若不想排除自动配置类,给自定义OpaqueTokenIntrospector Bean添加@Primary注解,确保Spring优先使用自定义实例:
@Bean @Primary public OpaqueTokenIntrospector introspector(final OAuth2ResourceServerProperties resourceServerProperties, final RestTemplateBuilder rtBuilder) { final String introspectionUri = resourceServerProperties.getOpaquetoken().getIntrospectionUri(); return new CustomOpaqueTokenIntrospector(introspectionUri, rtBuilder.build()); }
3. 验证Profile生效
自定义配置类标注了@Profile("!local"),需确认启动应用时使用的Profile不是local(可通过spring.profiles.active配置或启动参数指定),否则自定义配置不会加载,自动配置仍会执行。
额外说明
排除自动配置类后,若OAuth2资源服务器基础配置缺失,可在SecurityConfiguration中手动配置必要组件,或确保spring-boot-starter-oauth2-resource-server依赖提供的基础Bean正常加载。
内容的提问来源于stack exchange,提问作者ateebahmed

