我正在使用带有WildFly9.0.1的JSF 2(Mojarra 2.2.11)。
我有3 selectOneMenu
s,如下所示。使用omnifaces converter
,ajax事件可以很好地将数据加载到下一个数据。
问题:即使填充了第三个“标题”selectOneMenu
,在h:commandButton
操作上,我也无法让Header对象在辅助bean中给出Null。
我可以在调用saveNewHeader
方法时获取模块对象,但在我尝试访问标头对象时saveNewQuestion
崩溃。
从参考:Retrieving the value of the selected item in a SelectOneMenu List,我怀疑JSF的队列处理问题?
我该如何解决/管理它?谢谢你的时间。
控制台:
12:37:17,583 FATAL [javax.enterprise.resource.webcontainer.jsf.context] (default task-1) JSF1073: javax.faces.FacesException caught during processing of INVOKE_APPLICATION 5 : UIComponent-ClientId=, Message=#{questionBean.saveNewQuestion(questionBean.header)}: java.lang.NullPointerException
...
XHTML:
<ui:composition xmlns=...>
<h:head></h:head>
<h:body>
<h:form id="frmQuestion" >
<h4>Add Question to Header</h4>
<h:panelGrid columns="2">
<h:outputLabel value="ProductType: " />
<h:selectOneMenu value="#{questionBean.productType}" converter="omnifaces.SelectItemsConverter">
<f:selectItem itemValue="#{null}" itemLabel="-- select one --" />
<f:selectItems value="#{questionBean.productTypes}" var="productType"
itemValue="#{productType}" itemLabel="#{productType.type}" />
<f:ajax listener="#{questionBean.loadModules()}" render="moduleId2" />
</h:selectOneMenu>
<h:outputLabel value="Module: " />
<h:selectOneMenu id="moduleId2" value="#{questionBean.module}" converter="omnifaces.SelectItemsConverter">
<f:selectItem itemValue="#{null}" itemLabel="-- select one --" />
<f:selectItems value="#{questionBean.modules}" var="module"
itemValue="#{module}" itemLabel="#{module.moduleName}" />
<f:ajax listener="#{questionBean.loadHeaders()}" render="headerId2" />
</h:selectOneMenu>
<h:outputLabel value="Header Name: " />
<h:selectOneMenu id="headerId2" value="#{questionBean.header}" converter="omnifaces.SelectItemsConverter">
<f:selectItem itemValue="#{null}" itemLabel="-- select one --" />
<f:selectItems value="#{questionBean.headers}" var="header"
itemValue="#{header}" itemLabel="#{header.name}" />
</h:selectOneMenu>
</h:panelGrid>
<h:commandButton action="#{questionBean.saveNewQuestion(questionBean.header)}" value="Add New Question"
/>
...
QuestionBean:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class QuestionBean implements Serializable {
private List<Header> headers; // getter & setter
private Header header; // getter & setter
private List<Module> modules; // getter & setter
private Module module; // getter & setter
@PostConstruct
public void init(){
this.productTypes = publicService.getAllproductTypes();
}
public void saveNewHeader(Module module)
{
System.out.println(module.getModuleName()); // works fine
}
public void saveNewQuestion(Header header){
System.out.println(header.getHeaderName()); // crashes here
}
更新(在BalusC评论之后)
看起来这个bean的行为就像@RequestScoped
:这怎么会发生?