Spring MVC应用中@Resource注入List引发空指针异常求助
解决Spring MVC中FBContainer的products集合NullPointerException问题
我来帮你排查这个导致NullPointerException的问题,核心原因是FBContainer里的products集合没有被正确注入,下面是几个可能的原因和对应的解决办法:
1. 注解注入与XML配置的冲突
你在FBContainer类中使用了@Resource(name = "FBList")注入List<FBProduct>,同时又在dispatcher-servlet.xml里通过<property>标签给FBContainer注入products属性。这两种注入方式同时存在时,很可能会导致Spring的注入逻辑混乱,最终使得products字段为null。
解决思路:二选一即可
如果你想保留XML配置:删除
FBContainer中products字段上的@Resource注解,同时确保XML里的<property>配置正确指向FBList的id:<bean id="FBContainer" class="com.yourpackage.FBContainer"> <!-- 确保name属性和FBContainer里的字段名/setter方法名匹配 --> <property name="products" ref="FBList"/> </bean> <util:list id="FBList"> <!-- 这里添加FBProduct的实例配置,比如: --> <bean class="com.yourpackage.FBProduct"/> </util:list>同时要保证
FBContainer有对应的setProducts(List<FBProduct> products)方法,Spring通过setter完成XML注入。如果你想保留注解注入:删除XML中
FBContainer的<property>配置,同时确保:FBContainer被Spring管理(比如加了@Component注解,或者XML里配置了该Bean)- 配置了
<context:component-scan base-package="com.yourpackage"/>来扫描注解 @Resource(name = "FBList")的name值和XML中<util:list>的id完全一致
2. 检查注入的必要条件
- 如果用XML的
<property>注入:必须存在对应的setter方法,Spring无法直接注入没有setter的私有字段(除非开启字段注入的支持,但XML配置默认依赖setter)。 - 如果用注解注入:确保
FBContainer已经被Spring识别为Bean,要么加@Component等注解,要么在XML里配置了该Bean,同时组件扫描范围覆盖了这个类所在的包。
3. 确认FBList的配置有效性
检查dispatcher-servlet.xml里的<util:list id="FBList"是否正确:
- id是否拼写正确,和
@Resource的name或者XML里的ref值一致 - list内部是否正确初始化了
FBProduct实例,如果list本身配置错误,可能导致注入失败
4. 调试小技巧
- 在
FBContainer的setProducts方法里添加日志输出,看看这个方法是否被Spring调用,以及传入的list是否为null:public void setProducts(List<FBProduct> products) { System.out.println("Products注入:" + products); this.products = products; } - 或者在
FBContainer的构造方法里打印日志,确认Bean是否被正确初始化。
内容的提问来源于stack exchange,提问作者Danil.B




