Using enum in selectOneMenu fails with: 'Male' must be convertible to an enum

11,933

Your problem is that your <f:selectItem> specify strings, while in the <h:selectItem value="#{employeeBean.newEmployee.gender}"> seems to return one of the two Gender enums.

Enums are AFAIK directly convertible without converter as long as you stick the same values into both.

Here's the/a pattern:

<h:selectOneMenu value="#{employeeBean.newEmployee.gender}" id="gender">
    <f:selectItems value="#{enumValuesProvider.genders}"
                   var="gender"
                   itemValue="#{gender}"
                   itemLabel="#{gender.name()}" />
</h:selectOneMenu>

Note, I'm using <f:selectItems> here. The problem is, you can't simply get the values from a JSF page directly. You will need a dedicated bean to do the job:

@Named      // or @ManagedBean if you're not using CDI
@ViewScoped // or @RequestScoped
public EnumValuesProvider implements Serializable
{
    public Gender[] getGenders()
    {
        return Gender.values();
    }
}

This is just written down without any testing. No warranties.

Share:
11,933

Related videos on Youtube

user1540625
Author by

user1540625

Updated on June 16, 2022

Comments

  • user1540625
    user1540625 about 2 years

    I am about developing a small jsf project and I arrived to a state that I have to store a value in an enumeration type but couldn't figure out how to deal with

    so I post here a small description of my problem:

    here is the enumeration type:

     package com.enumeration;
    
     import java.io.Serializable;
    
    
     public enum Gender implements Serializable{
    
        Male('M'), Female('F');
    
        private char description;
    
       private Gender(char description) {
         this.description = description;
       }
    
       public char getDescription() {
         return description;
       }
    

    }

    the xhtml page:

        <h:panelGrid columns="2">
                    <h:outputLabel value="Nom:" for="nom" />
                    <h:inputText id="nom" value="#{employee.newEmployee.nom}" title="Nom" />
    
                    <h:outputLabel value="Gender:" for="gender" />
                    <h:selectOneMenu value="#{employeeBean.newEmployee.gender}" id="gender">
                         <f:selectItem itemLabel="Male" itemValue="Male" />
                        <f:selectItem itemLabel="Female" itemValue="Female"/>
                    </h:selectOneMenu>
    
                </h:panelGrid>
                <h:commandButton value="ajouter" action="index.xhtml" actionListener="#{employeeBean.ajouter}" />
            </h:form>
    

    the problem is that when I try to add a new row to the database, and error is thrown by jsf: j_idt7:gender: 'Male' must be convertible to an enum.

    I did some search on the net but couldn't understand the solutions please help thanks

  • user1540625
    user1540625 over 11 years
    hi thanks for help, i did as follows <h:outputLabel value="Gender:" for="gender" /> <h:selectOneMenu value="#{employeeBean.newEmployee.gender}" id="gender"> <f:selectItems value="#{employeeBean.genders}" var="gender" itemValue="#{gender.description}" itemLabel="#{gender}"/> </h:selectOneMenu> and i gt the error "j_idt20:gender: 'F' must be convertible to an enum. "
  • rodrigocprates
    rodrigocprates about 10 years
    probably you have an "Select" item with null value, or something like that