You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot3升级:自定义OpaqueTokenIntrospector未生效,clientId为空

解决Spring Boot 3.x自定义OpaqueTokenIntrospector未覆盖自动配置的问题

问题根源

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:57:07