在回发

时间:2016-01-03 11:48:03

标签: jsf selectonemenu view-scope

我正在使用带有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:这怎么会发生?

enter image description here

0 个答案:

没有答案