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
相关产品推荐
相关产品推荐

