Validierungs-Fehler: Wert ist nicht gültig
Ich habe ein problem mit einem p:selectOneMenu, egal was ich mache ich Schaffe es nicht, JSF aufrufen der setter auf die JPA-Entität. JSF-Validierung schlägt fehl mit dieser Meldung:
form:Lage: Validierungs-Fehler: Wert ist nicht gültig
Habe ich diese arbeiten auf mehrere andere Klassen des gleichen Typs (ie, join-Tabelle Klassen), aber nicht für das Leben von mir bekommen diese arbeiten.
Wenn jemand werfen einige Fehlersuche/debugging-Tipps für diese Art von problem, es würde sehr geschätzt werden.
Mit log-Anweisungen, die ich überprüft haben, das folgende:
- Die
Conveter
ist wieder richtig, nichtnull
Werte. - Ich habe keine Bean-Validation in meinem JPA-Entitäten.
- Setter
setLocation(Location location)
wird nie aufgerufen.
Dies ist das einfachste Beispiel, das ich tun kann, und es wird einfach nicht funktionieren:
<h:body>
<h:form id="form">
<p:messages id="messages" autoUpdate="true" />
<p:selectOneMenu id="location" value="#{locationStockList.selected.location}" converter="locationConverter">
<p:ajax event="change" update=":form:lblLocation"/>
<f:selectItems value="#{locationStockList.locationSelection}"/>
</p:selectOneMenu>
</h:form>
</h:body>
Konverter:
@FacesConverter(forClass=Location.class, value="locationConverter")
public class LocationConverter implements Converter, Serializable {
private static final Logger logger = Logger.getLogger(LocationConverter.class.getName());
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value.isEmpty())
return null;
try {
Long id = Long.parseLong(value);
Location location = ((LocationManagedBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "location")).find(id);
logger.log(Level.SEVERE, "Converted {0} to {1}" , new Object[] {value, location});
return location;
} catch (NumberFormatException e) {
return new Location();
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.toString().isEmpty() || !(value instanceof Location))
return "";
return String.valueOf(((Location) value).getId());
}
}
Ausgabe der Konsole:
//Getter method
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
//Session Bean
INFO: Finding ejb.locations.Location with id=3
//Session Bean
INFO: ### Returning : ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
//Converter
SEVERE: Converted 3 to ejb.locations.Location[id=3, name=mdmd, latitude=4.5, longitude=2.3]
//Getter method -> Where did my selected Location go ??
INFO: Current value=ejb.locations.Location[id=null, name=null, latitude=0.0, longitude=0.0]
InformationsquelleAutor klonq | 2012-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Fehler läuft darauf hinaus, dass das ausgewählte Element nicht mit einem der verfügbaren wählen Sie den Menüpunkt angegebenen Werte durch geschachtelte
<f:selectItem(s)>
tag während der Verarbeitung des Formulars abschicken.Als Teil Schutz gegen manipuliert/gehackt Anfragen, JSF wiederholen über alle zur Verfügung wählen Sie den Menüpunkt Werte und testen Sie, ob
selectedItem.equals(availableItem)
zurücktrue
für mindestens ein freier Eintrag Wert. Wenn kein Element mit dem Wert übereinstimmt, dann bekommen Sie genau diese Fehler bei der überprüfung.Dieser Prozess ist unter dem deckt grundsätzlich als unten, wobei
bean.getAvailableItems()
fictionally stellt die gesamte Liste der verfügbaren Elemente auswählen, wie definiert durch<f:selectItem(s)>
:So, basierend auf den oben genannten Logik, dieses problem kann logischerweise mindestens die folgenden Ursachen:
equals()
- Methode der Klasse, die das ausgewählte Element fehlt oder kaputt ist.Converter
beteiligt ist, dann hat wieder das falsche Objekt ingetAsObject()
. Vielleicht ist es nochnull
.Es zu lösen:
@ViewScoped
statt@RequestScoped
beheben sollte in den meisten Fällen. Auch stellen Sie sicher, dass Sie nicht führen Sie die business-Logik in der getter-Methode der<f:selectItem(s)>
sondern in@PostConstruct
oder ein action-event (listener) Methode. Wenn Sie sich auf bestimmte request-Parameter, dann müssten Sie explizit speichern Sie in der@ViewScoped
bean, oder, neu-pass auf nachfolgende Anforderungen von z.B.<f:param>
. Siehe auch Wie wählen Sie die richtige bean-scope?equals()
- Methode umgesetzt werden. Dies ist bereits geschehen Recht auf standard-Java-Typen wiejava.lang.String
,java.lang.Number
etc, aber nicht unbedingt auf benutzerdefinierte Objekte/beans/entites. Siehe auch Rechts wird die Implementierung der equals-Vertrag. Falls Sie bereits mitString
, stellen Sie sicher, dass der Antrag Zeichenkodierung richtig eingestellt ist. Wenn es Sonderzeichen enthält und JSF konfiguriert ist zum Rendern der Ausgabe als UTF-8 interpretieren Sie die Eingabe wie z.B. ISO-8859-1, dann wird es scheitern. Siehe auch eine.o. Unicode-Eingabe abgerufen via PrimeFaces input-Komponenten beschädigt.Converter
und befestigen Sie es entsprechend. Für Richtlinien, siehe auch Fehler bei der Konvertierung von Wert für die Einstellung für "null-Konverter', falls Sie mitjava.util.Date
als verfügbare Elemente mit<f:convertDateTime>
stellen Sie sicher, dass Sie vergessen Sie nicht die volle Zeit in das Muster. Siehe auch "Überprüfungsfehler: Wert ist ungültig" - Fehler von f:datetimeConverter.Siehe auch:
selectOneMenu
wiki-SeiteNur bitten, eine klare und konkrete Frage hier. Fragen Sie nicht zu Fragen 😉
equals
check passieren. Meine situation ist ein bisschen komplexer. Erstelle ich meine eigene benutzerdefinierte Komponente, die dem Benutzer erlauben, komplexe radio-layout. Es funktioniert gut, wenn ich nur einen radio-Gruppe (f:selectItems direkt unter meine benutzerdefinierte Komponente). Doch wie das layout komplexer (mehrere radio-Gruppe, haben jeweils Ihre eigenen f:selectItems aber alle teilen die gleiche Auswahl), ich habe f:selectItems innerhalb ui:repeat, dann die ui:repeat ist unter meiner benutzerdefinierte Komponente. Ich lief dann in dieses Problem. Den will ich sehen mojarra code, den Griff dieserAuch meine f:selectItems ist Typ String, so bin ich sicher, dies ist keine Konvertierung problem, ich denke, das ist eine Ursache, weil die Liste f:selectItems ist nicht da während der Validierung phase.
Können Sie näher erläutern, wie die Verwendung f:param senden Zustand der managed-bean, so dass Sie neu erstellen können die "initial-state"??? Danke.
Mit einem ähnlichen Fehler. Ich bin mit den SelectItemsConverter und diese Komponente ist im inneren ein Behindertengerechter fieldset - so ist es deaktiviert. Ist es ein bekanntes Verhalten?
Wenn Sie mit enum für die Elemente anzeigen und Ihre backing-bean haben String-Typ für die Einstellung der Wert in der bean und nicht mit jedem Umrichter erhalten Sie die gleiche Fehlermeldung. Das ist, wie ich hier gelandet.
InformationsquelleAutor BalusC
In meinem Fall habe ich vergessen zu implementieren, die eine korrekte get - /set-Methoden. Es geschah, weil ich mich geändert habe eine Menge von Attributen entlang der Entwicklung.
Ohne eine richtige Methode get, JSF kippe erholen Ihre ausgewählte Element, und passiert das, was BalusC sagte bei Ziffer 1 seiner Antwort:
InformationsquelleAutor Henrique Liberato
Diese können sein a-Wandler Problem oder sonst DTO Problem.
Versuchen Sie um dieses Problem zu lösen, indem hashCode() und equals () - Methoden in Ihrem Objekt DTO; Im obigen Szenario können Sie generieren diese Methoden in der Lage Objekt-Klasse, die angeben, wie die 'DTO' hier.
Beispiel:
Warum sind Sie die Wiederholung einer bereits gegebenen Antwort?
InformationsquelleAutor Rizla Shareefdeen