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

SpringBoot 基于@ConditionalOnProperty按需加载配置类及@Value解析报错问题

问题根因

该报错和@ConditionalOnProperty的执行时序无关。
正常Spring容器加载流程中,@Conditional系列注解的判断发生在配置类扫描、Bean定义生成阶段,这个阶段远早于Bean实例化、@Value属性注入的步骤。只要条件不满足,整个配置类的Bean定义都会被直接排除,根本不会走到类内的@Value解析逻辑。
从给出的报错信息来看,解析失败的占位符是${ISSUER_URI},和写在ApiSecurityConfiguration里的${spring.security.oauth2.resourceserver.jwt.issuer-uri}完全不是同一个配置路径,说明报错并非该配置类触发。

解决步骤

修正配置类的条件判断逻辑

明确给@ConditionalOnProperty指定匹配规则,避免匹配失效:

@EnableWebSecurity
@Configuration
@ConditionalOnProperty(
    name = "spring.security.oauth2.resourceserver.jwt.issuer-uri",
    matchIfMissing = false
)
@Order(2)
public class ApiSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
    private String issuerUri;
}
  • 显式声明matchIfMissing = false,保证属性不存在时完全跳过当前配置类,不生成任何相关Bean定义
  • 可额外补充非空校验,避免配置了空字符串的情况被误判为条件满足

为注入逻辑增加兜底值

在@Value注解的占位符后增加默认值兜底,哪怕后续有遗漏的配置引用,也不会因为属性不存在直接抛出解析异常:

@Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri:}")
private String issuerUri;

冒号后的空字符串就是属性不存在时的注入默认值。

定位真实报错源头

根据报错中的ISSUER_URI占位符,逐一排查触发异常的来源:

  • 全局搜索项目中所有直接写了@Value("${ISSUER_URI}")的类,给这些类也加上和ApiSecurityConfiguration一致的条件判断,保证只有属性存在时才会触发注入
  • 检查.env文件的加载逻辑:有没有在应用启动早期(Bean装配阶段之前)就硬编码强制校验ISSUER_URI环境变量的逻辑,比如自定义的EnvironmentPostProcessor、启动脚本的前置校验
  • 排查配置绑定规则:如果做了自定义的环境变量映射,确认映射逻辑不会在属性缺失时直接触发占位符解析失败
  • 检查是否存在无差别加载的WebSecurityConfigurerAdapter实现类,这类类的加载顺序如果早于带条件判断的配置类,且内部引用了issuer-uri相关配置,会在条件判断生效前就触发占位符解析失败

内容的提问来源于stack exchange,提问作者DaveShaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 03:36:05