selected item in selectonemenu is always null

2.2k Views Asked by At

I am trying to use a <p:dataTable> to display the contents of an object selected from a <p:selectOneMenu> list.

The <p:selectOneMenu> is correctly populated with options. However:

  1. The <p:dataTable> is not updated when I select an item from the <p:selectOneMenu>
  2. The server log indicates that the value of #{MB.selectedDatabase} is null.
  3. #{MB.setSelectedDatabase()} is never invoked.

XHTML:

<h:form id="form">
    <h:messages id="messages" />
    <p:panelGrid columns="2">
        <p:outputLabel value="Data:" />
        <p:selectOneMenu   immediate="true" id="customDatas" value="#{MB.selectedDatabase}"  >          
            <p:ajax execute="customDatas" render="infos" listener="#{MB.whatIsSelected()}"  />
            <f:selectItem itemLabel="Select Data" itemValue="" />  
            <f:selectItems value="#{MB.datas}" var="data" itemLabel="#{data.name}" itemValue="#{data.id}"/>                                         
        </p:selectOneMenu>                                           
    </p:panelGrid>               
    <p:dataTable value="#{MB.selectedDatabase.infos}" var="item" id="infos"  >              
        <p:column >
            <f:facet name="header">
                <h:outputText value="Info"/>
            </f:facet>
            <h:outputText value="#{item.info}"/>
        </p:column>                   
    </p:dataTable>                 
</h:form>

Partial code from my sessionScoped Bean:

 public Data selectedDatabase;

 public void whatIsSelected(){
    logger.log(Level.SEVERE, "Selected data is : {0}", selectedDatabase.getName());
    infoBusinessLocal.getinfosbydata(selectedDatabase);
 }

 public Data getSelectedDatabase() {
    return selectedDatabase;
 }

 public void setSelectedDatabase(Data selectedDatabase) {
    logger.log(Level.SEVERE, "Set selectedDB is invoked");
    this.selectedDatabase = selectedDatabase;
 }
1

There are 1 best solutions below

0
On

SelectOneMenu with Pojo classes is needed a JSf converter between page and managed bean. Converter converts string from page to objects in managed beans.

@FacesConverter("dataConverter")
public class DataConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        //return proper object, value is the string on the page
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) {
        //return the string value of object which will be presented on the page
    }

}

Add converter attribute to SelectOneMenu

<p:selectOneMenu   immediate="true" id="customDatas" value="#{MB.selectedDatabase}"  converter="dataConverter"> 

See also

BalusC SelectOneMenu tutorial