2017-04-09 104 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>