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

Spring Boot使用@ConfigurationProperties注入配置出现空指针怎么解决?

问题原因

出现空指针的核心是两个配置类里的Map属性都没有被正确注入,导致传入UserDataServiceImpl构造方法时为null,调用Collections.unmodifiableMap时抛出空指针,具体有3处错误:

  • 配置文件层级和属性类不匹配
    @ConfigurationProperties是将前缀对应节点下的子节点和配置类的属性一一绑定:
    • 你给DatabaseTypeMapping设置的前缀是repository.type,配置类里的属性是typeMappingMigration,但你yml里repository.type下直接放了big/small/medium,缺少了typeMappingMigration层级,Spring找不到对应属性注入
    • 你给BrandToDatabaseProperties设置的前缀是repository.to.database,配置类里的属性是mapping,但你yml里repository.to.database下直接放了something,缺少了mapping层级,导致mapping属性为null
  • setter方法名和属性名不匹配
    Spring的setter注入规则是setXxx对应名为xxx的属性,你的DatabaseTypeMapping类属性名为typeMappingMigration,但setter方法叫setMapping,Spring无法匹配到对应属性,就算配置层级正确也注入失败
  • (可选)枚举匹配问题
    你Map的key是Type和Brand枚举类型,需要保证yml里的key和枚举实例名完全一致(大小写敏感),否则会出现类型转换失败,属性无法注入的问题

修复方案

1. 修改application.yml,补全属性层级

repository:
    type:
      # 补全和配置类属性名对应的层级
      typeMappingMigration:
        big: big
        small: small
        medium: medium
    to:
     database:
      # 补全和配置类属性名对应的层级
      mapping:
        something: "STRING"

2. 修正配置类的setter方法名,保证和属性名匹配

@Configuration
@EnableConfigurationProperties
public class SnowflakeRepositoryConfig {

        @Bean
        @ConfigurationProperties(prefix = "repository.type")
        public DatabaseTypeMapping databaseTypeMapping() {
            return new DatabaseTypeMapping();
        }
    
        public static class DatabaseTypeMapping {
            public Map<Type, Type> typeMappingMigration;
            // 修正setter方法名,和属性名匹配
            public void setTypeMappingMigration(Map<Type, Type> typeMappingMigration) {
                this.typeMappingMigration = typeMappingMigration; 
            }
            // 建议补充对应的getter方法,避免Spring反射读取属性失败
            public Map<Type, Type> getTypeMappingMigration() {
                return typeMappingMigration;
            }
        }

        @Bean
        @ConfigurationProperties(prefix = "repository.to.database")
        public BrandToDatabaseProperties brandToDatabaseProperties() {
            return new BrandToDatabaseProperties();
        }

        public static class BrandToDatabaseProperties {
            public Map<Brand, String> mapping;

            public void setMapping(Map<Brand, String> mapping) {
                this.mapping = mapping;
            }
            // 建议补充getter
            public Map<Brand, String> getMapping() {
                return mapping;
            }
        }
}

3. 核对枚举值匹配

确认Type枚举中存在和yml配置key对应的实例(Spring默认枚举转换严格匹配大小写),Brand枚举中存在和something对应的实例即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:45:08