使用SpringEL获取Map值始终为null,求排查问题原因
SpringEL @Value注入Map值为null的问题解决
问题核心原因
你直接通过new GetData()创建对象,这个对象不在Spring容器的管理范围内,Spring不会对其执行依赖注入逻辑,因此@Value注解标注的属性不会被赋值,始终为null。
而WorkersHolder的main方法能正常输出,是因为它直接创建自身对象并调用本地Map,没有依赖Spring的注入机制。
解决方法
方法一:通过Spring注解上下文获取容器管理的Bean
修改GetData的main方法,让Spring初始化上下文并从容器中获取实例:
import org.springframework.context.annotation.AnnotationConfigApplicationContext; @Data @Component public class GetData { @Value("#{workersHolder.salaryByWorkers['John']}") private Integer johnSalary; @Value("#{workersHolder.salaryByWorkers['George']}") private Integer georgeSalary; @Value("#{workersHolder.salaryByWorkers['Susie']}") private Integer susieSalary; public static void main(String[] args) { // 初始化Spring上下文,替换为你的类所在包路径 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.your.package"); // 从容器中获取受Spring管理的GetData实例 GetData getData = context.getBean(GetData.class); // 此时会输出35000 System.out.println(getData.johnSalary); // 关闭上下文 context.close(); } }
注意将com.your.package替换为WorkersHolder和GetData实际所在的包名。
方法二:基于SpringBoot应用启动(适用于SpringBoot项目)
如果是SpringBoot项目,可通过启动类获取容器中的Bean:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class YourApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(YourApplication.class, args); GetData getData = context.getBean(GetData.class); System.out.println(getData.johnSalary); } }
确保WorkersHolder和GetData在启动类的扫描范围内(默认同包或子包即可)。
额外说明
WorkersHolder上的@Component("workersHolder")注解配置正确,SpringEL表达式#{workersHolder.salaryByWorkers['John']}中的名称与Bean名称一致,无需修改。
内容的提问来源于stack exchange,提问作者黃奕翔
相关产品推荐
相关产品推荐

