selectOneMenu 枚举验证错误

selectOneMenu enum validation error

所以我在提交表单时得到 Validation Error: Value is not valid

我的枚举如下所示:

public enum Version {
    none, v1_3("1.3"), v1_4("1.4");
        private BigDecimal version;

Version(String vers) {
    version = new BigDecimal(vers);
}

Version() {
}

public String toString() {
    if(version == null){
        return " ";
    } 
    else{
        return version.toPlainString();
    }
}
...

当我尝试提交以下表格时,出现了上述错误:

<h:form>
                    <p>
                        <h:outputText value="Test Version: " />
                        <h:selectOneMenu binding="#{inputVersionTest}">
                            <f:selectItems value="#{myBean.getVersionValues()}" />
                        </h:selectOneMenu>
                    </p>
            <h:commandButton value="Test" type="submit" action="#{myBean.test(inputVersionTest.value)}" />
        </h:form> 

我在我的枚举中使用我的 toString() 方法,当我 return "none" (就像枚举值命名一样)如果版本属性为 null,JSF 表单实际上是在职的。 问题是我的下拉菜单中的值与枚举值不匹配。

下拉菜单的值是通过以下方法在 myBean 中创建的:

public Version[] getVersionValues(){
        return Version.values();
    }

toString() 方法将这些值转换为“”、1.3 和 1.4。但是我需要让它工作(看起来)是 none、v1_3 和 v1_4。 我还尝试在 Version.java 中创建自己的 equals 方法,但没有成功。 (等于(字符串)和等于(版本))。

如果您有一个 TObject 后代的值并且您想要在 JSF 页面中处理它,那么您必须通过自定义转换器定义它的外观。 (Java 枚举值也是 类)。

自定义转换器:

@FacesConverter( "myCustomConverter" )
public class MyCustomConverter implements Converter
{
  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value)
  {

    //...
  }
  @Override
  public String getAsString(FacesContext context, UIComponent component, Object 
  value)
  {
    //...
 }
}

及其用法:

<h:form>
  <h:inputText value="#{myBean.myCustomValue}">
    <f:converter converterId="myCustomConverter">
  </h:inputText>
</h:form>

但是 JSF 包含一个用于枚举的内置转换器。所以你可以像使用原始类型一样使用它们。

示例枚举类型:

public enum MyEnum
{
  VALUE1, VALUE2, VALUE3, VALUE4
}

存储枚举值的托管 bean:

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class MyManagedBean implements Serializable
{
    private MyEnum selectedMyEnum;

    public MyManagedBean()
    {}

    public MyEnum getSelectedMyEnum() { return selectedMyEnum; }
    public void setSelectedMyEnum( MyEnum selectedMyEnum_ ) { selectedMyEnum = selectedMyEnum_; }
    public MyEnum[] getMyEnumValues() { return MyEnum.values(); }
}

用于演示 MyEnum 基本类型的小面,如用法:

index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<h:body>
  <h:form>
            <h:selectOneRadio value="#{myManagedBean.selectedMyEnum}" layout="pageDirection">
                <f:selectItems value="#{myManagedBean.myEnumValues}"/>
            </h:selectOneRadio>
            <h:commandButton value="Submit" action="done"/>
    </h:form>
    </h:body>
</html>

done.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        The selected value is: #{myManagedBean.selectedMyEnum}
    </h:body>
</html>