2017-04-09 97 views
1

因此,当提交我的表单时,我得到一个Validation Error: Value is not validselectOneMenu枚举验证错误

我列举如下:

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方法,但它不起作用。 (等于(String)和等于(Version))。

+0

您必须为类型“版本”应用转换器。 Java枚举值是类,而不是整数。您必须指定如何通过'converter =“myRegisteredCustomConverterID''属性或''子标签来显示它们。一个例子:https://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/ –

+0

谢谢你,这是有效的。如果你能让你的评论成为答案,我可以接受它:) – kinglite

回答

0

如果您有一个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>