selectOneMenu枚举验证错误

时间:2017-04-09 16:24:47

标签: jsf enums selectonemenu

所以我在提交表单时得到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()方法,当我返回“none”(就像枚举值命名一样)如果version属性为null,则JSF表单实际上正在工作。 问题是我的下拉菜单中的值不会加上枚举值。

下拉菜单的值由myBean中的此方法创建:

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

toString()方法将这些值转换为“”,1.3和1.4。但我需要让它工作(似乎)是没有,v1_3和v1_4。 我也尝试在Version.java中创建自己的equals方法,但它没有用。 (equals(String)和equals(Version))。

1 个答案:

答案 0 :(得分:0)

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

自定义转换器:

$ pip install pyexcel-cli
$ pyexcel transcode your-file-in.xls your-new-file-out.xlsx

及其用法:

@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)
  {
    //...
 }
}

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

示例枚举类型:

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

托管bean存储枚举值:

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

用于演示MyEnum基元类型的facelets,如用法:

的index.xhtml

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(); }
}

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://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>