Ich habe ein Problem mit p: selectOneMenu von PrimeFaces in JSF. Ich habe viele Fragen über das gleiche Problem gelesen, aber nichts hat mir geholfen.Primefaces Validierungsfehler mit Konverter und funktioniert gleich
Wenn ich meine Komponente die gleiche Weise, die ich in meinem Projekt, wo immer zu tun pflegte eingerichtet, wenn ich versuche, einem der Gegenstände meiner selectOneMenu auszuwählen, dieser Fehler angezeigt:
Validation Error: Value is not valid
Viele Leute beheben Sie dies, indem Sie die Konverter Klasse oder equals() Methoden korrigieren, aber nichts schief in Minen.
Converter
@RequestScoped
public class BaremeConverter implements Converter {
@EJB
private BaremeBean baremeBean;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
return baremeBean.loadById(Integer.parseInt(value));
} catch(NumberFormatException e) {
return null;
}
}
else {
return null;
}
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if(object != null) {
return String.valueOf(((Bareme) object).getId());
}
else {
return null;
}
}
}
BaremeBean ist die EntityBean dieser Klasse, die Daten in Ordnung geladen ist. Mein Arbeitsbereich ist voll von Konvertern wie diesem, also außer wenn ich etwas in diesem hier vermisse, sollte es hier funktionieren.
equals() Methode der Klasse Bareme
@Override
public boolean equals(Object object) {
if (!(object instanceof Bareme)) {
return false;
}
Bareme other = (Bareme) object;
return !((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)));
}
Dies ist die Methode equals() von Netbeans erzeugt und nichts sieht auch hier falsch.
Schließlich gebe ich Ihnen den Code der Komponente, die ich verwende, und dasselbe wie die vorherigen, der gleiche Code funktioniert für andere Klassen, die ich bekam.
<h:outputLabel for="forfaitBareme" value="Barème" />
<p:selectOneMenu id="forfaitBareme" class="print-w100p-lab" value="#{transportFacturationBean.forfait.bareme}" converter="#{baremeConverter}" >
<f:selectItem itemLabel="" itemValue="#{null}" />
<f:selectItems value="#{transportFacturationBean.baremesForfait}" var="b" itemLabel="#{b.id}" itemValue="#{b}" />
<p:ajax event="change" update=":centralPanel" process="@form" />
</p:selectOneMenu>
transportFacturationBean.baremesForfait ist ein java.util.List, die wenige Bareme enthält.
Sie sollten wissen, dass der folgende Code mit einem anderen benutzerdefinierten Objekt meines Projekts funktioniert. Camion ist auf die gleiche Weise implementiert wie Bareme, ihre Konverter sind ähnlich, und ihre equals() -Methode sind beide diejenigen, die von Netbeans erzeugt werden.
<h:outputLabel for="forfaitCamion" value="Camion" />
<p:selectOneMenu id="forfaitCamion" class="print-w100p-lab" value="#{transportFacturationBean.forfait.camion}" converter="#{camionConverter}" >
<f:selectItem itemLabel="" itemValue="#{null}" />
<f:selectItems value="#{transportFacturationBean.camions}" var="c" itemLabel="#{c.type}" itemValue="#{c}" />
<p:ajax event="change" update=":centralPanel" process="@form" />
</p:selectOneMenu>
Jede Hilfe wäre willkommen! Danke im Voraus !
Das Duplikat http://stackoverflow.com/q/9069379 beschreibt eine dritte Ursache, die Sie nicht erwähnt haben. – BalusC
@BalusC Wenn du davon sprichst, dass das ausgewählte Element nicht in den verfügbaren sein könnte, ist mein Element zuerst null und wie du sehen kannst, habe ich das f: selectItem mit Wert null hinzugefügt, was für mein Camion-Objekt funktioniert. Ich habe auch versucht, ein anderes Element in meiner Liste der verfügbaren in meinem ManagedBean auszuwählen, aber der Fehler ist immer noch hier. – rvz
Uh, ich habe nicht über Null-Gegenstände gesprochen. Nur dass der Artikel, der ausgewählt wurde, nicht mehr in der Liste verfügbarer Artikel zu dem Zeitpunkt ist, an dem die Formularübermittlung tatsächlich verarbeitet wird. – BalusC