2017-04-09 2 views
1

So bekomme ich eine Validation Error: Value is not valid beim Absenden meines Formulars.selectOneMenu enum Validierungsfehler

Meine Enum sieht wie folgt aus:

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

Wenn ich versuche, das folgende Formular abzuschicken ich die erwähnte Fehlermeldung erhalten:

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

Ich spielte mit meiner Methode toString() in meinem Enum und wenn ich "none" zurückgebe (genau wie die Benennung des enum-Wertes), wenn das version-Attribut null ist, arbeitet das JSF-Formular tatsächlich. Das Problem ist, dass die Werte in meinem Dropdown-Menü die Enum-Werte nicht bearbeiten.

Die Werte für die Drop-Down-Menü wird durch dieses Verfahren in MyBean erstellt:

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

Die toString() Methode wandelt diese Werte auf "", 1.3 und 1.4. Aber was ich brauche, um es funktionieren zu lassen (es scheint), ist none, v1_3 und v1_4. Ich habe auch versucht, meine eigene equals-Methode in Version.java zu erstellen, aber es hat nicht funktioniert. (entspricht (Zeichenfolge) und entspricht (Version)).

+0

Sie müssen einen Konverter für den Typ "Version" anwenden. Java-enum-Werte sind Klassen, keine Ganzzahlen. Sie müssen angeben, wie sie durch das Attribut 'converter = "myRegisteredCustomConverterID"' oder durch ein '' -Subtag angezeigt werden sollen. Ein Beispiel: https://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/ –

+0

Vielen Dank, das funktioniert. Wenn Sie Ihren Kommentar zu einer Antwort machen können, kann ich es akzeptieren:) – kinglite

Antwort

0

Wenn Sie einen Wert eines TObject-Nachkommen haben und ihn in JSF-Seiten behandeln möchten, müssen Sie seine Darstellung durch benutzerdefinierte Konverter definieren. (Java Enum-Werte sind auch Klassen).

Der Brauch Konverter:

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

Und seine Nutzung:

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

Aber JSF enthält einen eingebauten Konverter für Aufzählungen. Sie können sie also genauso wie die primitiven Typen verwenden.

Das Beispiel Aufzählungstyp:

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

Die Bohne Wich speichert den ENUM-Wert verwaltet:

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

Die facelets die MyEnum primitive Art wie Nutzung zu demonstrieren:

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>