在selectOneMenu中使用枚举失败:"男性"必须可转换为枚举

use*_*625 2 jsf enums selectonemenu

我是关于开发一个小型的jsf项目,我到了一个状态,我必须在枚举类型中存储一个值,但无法弄清楚如何处理

所以我在这里发布我的问题的一个小描述:

这是枚举类型:

 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;
   }
Run Code Online (Sandbox Code Playgroud)

}

xhtml页面:

    <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>
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试向数据库添加一个新行时,jsf抛出错误: j_idt7:性别:'男性'必须可转换为枚举.

我在网上做了一些搜索,但无法理解解决方案请帮忙谢谢

Kaw*_*awu 8

你的问题是你的<f:selectItem>指定字符串,而在<h:selectItem value="#{employeeBean.newEmployee.gender}">似乎返回两个Gender枚举之一.

只要你将相同的值粘贴到两者中,枚举就是AFAIK直接可转换而无需转换器.

这是/ a模式:

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

注意,我在<f:selectItems>这里使用.问题是,您不能直接从JSF页面获取值.你需要一个专门的bean来完成这项工作:

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

这是在没有任何测试的情况下写下来的.没有保证.