@FacesConverter verhindert Methode Call of P: Selectonemenu und P: Ajax
Frage
Ich habe ein seltsames Problem mit einem Brauch @FacesConverter
mit JBoss-7.1.0.cr1b während eines Ajax-Aufrufs p:selectOneMenu
(Primefaces 3.0).
Der vereinfachte Konverter sieht so aus, es gibt keine NPE oder andere Ausnahmen in dieser Klasse
@FacesConverter("MyConverter")
public class MyConverter implements Converter
{
public Object getAsObject(FacesContext fc, UIComponent uic, String value)
{
logger.debug("getAsObject value: "+value);
if (submittedValue.trim().equals("")) {return null;}
else
{
MyEjb ejb = new MyEjb();
ejb.setId(Long.parseLong(value()));
return ejb; //**** alternative with return null; ****
}
}
public String getAsString(FacesContext fc, UIComponent uic, Object value)
{
if (value == null || value.equals("")) {return "";}
else
{
MyEjb ejb = (MyEjb)value;
return ""+ejb.getId();
}
}
}
Der Konverter wird in a verwendet p:selectOneMenu
:
<h:form>
<p:selectOneMenu value="#{clientBean.selected}" converter="MyConverter">
<f:selectItems value="#{clientBean.all}" var="my"
itemLabel="#{my.name}" itemValue="#{my}"/>
<p:ajax listener="#{clientBean.changed}" />
</p:selectOneMenu>
</h:form>
Das ist keine Raketenentwicklung, die veränderte Methode feiert einfach ein Debugg:
public void changed()
{
logger.info("changed() "+selected);
}
Aber jetzt der nervige Teil: der changed()
wird nie mit dem Code wie oben aufgerufen, aber ich lasse den Konverter aufgerufen drei mal:
12:37:51,500 DEBUG getAsObject value: 35
12:37:51,502 DEBUG getAsObject value:
12:37:51,503 DEBUG getAsObject value:
Wenn ich das ändere p:selectOneMenu value="#{clientBean.selectedId}"
zu einem long selectedId
Und verwenden Sie den Konverter nicht, dass die Methode einmal aufgerufen wird. Selbst wenn ich return null
in getAsObject()
das changed()
wird (einmal) genannt. Ich gehe nicht davon aus, dass es sich h:selectOneMenu
und f:ajax
.
Lösung
Sie sollten eine haben <p:messages />
, <p:growl />
oder <h:messages />
Welches ist in Ihrer Sicht auf dem neuesten Stand. Sie sollten auch auf Warnungen in Serverprotokollen über mögliche Nachrichten für fehlende Gesichter achten. Die Chance ist groß, dass Sie das berüchtigte sehen Validation error: Value not valid
Validierungsfehler.
Nach der Konvertierung bestätigt JSF, ob das eingereichte Objekt eines der verfügbaren Elemente im Rahmen von Schutz vor manipulierten/gehackten Anfragen ist. JSF wird das von tun submittedObject.equals(oneOfAvailableObjects)
Für jedes der verfügbaren Objekte, wie Sie dort haben <f:selectItems>
. Wenn nichts übereinstimmt, zeigt JSF diesen Validierungsfehler an.
In Ihrem speziellen Fall die MyEjb
Klasse hat anscheinend nein equals()
Methode oder ihre Implementierung ist gebrochen. Siehe auch Richtige Möglichkeit, gleichvertrag zu umsetzen.