复合组件中java.util.List类型属性listofthings始终为null问题求助
我来帮你捋捋这个问题,结合JSF复合组件的常见踩坑点,大概率是这几个原因导致的,你可以挨个排查看看:
先检查你的mycomponent.xhtml里的<cc:interface>部分,listofthings属性的定义是否正确。要确保用<cc:attribute>标签声明,并且类型、必填性都配置到位,比如:
<cc:interface> <cc:attribute name="test" type="java.lang.Integer" /> <cc:attribute name="listofthings" type="java.util.List" required="true" /> </cc:interface>
注意:如果required设为true,那在使用组件时必须传递该属性值;另外属性类型要和Bean里的listofthings类型完全匹配,避免类型转换失败导致值为null。
检查使用复合组件的页面代码,listofthings的EL表达式有没有拼写错误,比如是不是把#{bean.listofthings}写成了#{bean.listOfThings}(大小写不一致),或者漏写了#{}包裹?正确的写法应该是这样:
<my:mycomponent test="#{bean.test}" listofthings="#{bean.listofthings}" />
另外别忘了确认Bean的作用域,如果是@RequestScoped但你需要跨请求保留数据,那得换成@ViewScoped或者@SessionScoped,不然每次请求都会重新创建Bean,可能导致初始化的列表丢失。
如果你的复合组件有对应的后台类(比如用@FacesComponent注解),要确保listofthings的getter/setter方法完全正确,注解配置也没毛病。示例代码如下:
@FacesComponent("my.newComponent") public class MyNewComponent extends UIComponentBase { private List<String> listofthings; private Integer test; @Override public String getFamily() { return "my.newComponentFamily"; } public List<String> getListofthings() { return listofthings; } public void setListofthings(List<String> listofthings) { this.listofthings = listofthings; } // test的getter/setter方法... }
提醒:复合组件的后台类一般不用@ManagedProperty注入属性,而是通过页面的EL绑定直接传递,别搞混了注入方式。
你提到在构造函数和init()方法里初始化都没用,那得先搞清楚:你初始化的是页面绑定的Bean里的listofthings,还是复合组件后台类里的listofthings?
如果是页面Bean里的属性,推荐用@PostConstruct注解的方法来初始化,比构造函数更可靠(尤其是有依赖注入的场景),示例代码:
@ManagedBean @ViewScoped public class MyBean { private Integer test = 5; private List<String> listofthings; @PostConstruct public void init() { // 这里初始化列表 listofthings = new ArrayList<>(); listofthings.add("测试项1"); listofthings.add("测试项2"); } // listofthings和test的getter/setter方法... }
要是你之前在构造函数里初始化没生效,试试@PostConstruct,它会在Bean构造完成、依赖注入都完成后再执行。
如果listofthings是JPA的懒加载集合(比如@OneToMany注解的属性),那在复合组件中使用时可能还没被初始化,导致显示为null。这种情况可以在Bean的init()方法里主动触发加载,比如调用listofthings.size()。
要是以上几点都排查过还是解决不了,建议你把相关代码片段贴出来(比如mycomponent.xhtml的<cc:implementation>部分、Bean的属性定义代码),这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者Himanshu Arora

