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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top