3 Stimmen

Validierungsfehler Wert ist nicht gültig

Ich weiß, dass dies ein häufiger Fehler ist und dass es eine Menge Fragen dazu gibt, aber ich muss eine neue erstellen.

Hier ist meine jsf-Seite:

<h:form id="clientCreatingForm">
    <p:selectOneMenu id="city" value="#{kkmBean.client.address.city}" style="width: 263px;" 
          converter="cityConveter" required="true" requiredMessage="You must choose one city">
          <f:selectItems value="#{kkmBean.cityList}" var="city" itemLabel="#{city.cityName}" itemValue="#{city.cityID}"/>
     </p:selectOneMenu>

     <p:commandButton value="Save client" type="button" onclick="confirm.show()" style="margin-top: 20px; margin-left: 30px; width: 180px;" />
     <p:commandButton value="Reset fields" type="reset" style="margin-top: 20px; margin-left: 30px; width: 180px;"/>

          <p:confirmDialog message="Are you sure, you want to save client?" 
               header="Save client" severity="info" widgetVar="confirm">

               <p:commandButton value="Yes, I am sure." oncomplete="confirm.hide()" 
                                         action="#{kkmBean.saveClient}" update=":warnings" style="font-size: 12px;"/>
               <p:commandButton value="No, I don't!" onclick="confirm.hide()" type="button" style="font-size: 12px;"/>
          </p:confirmDialog>
</h:form>

Hier wird die Bohne verwaltet:

@ManagedBean(name = "kkmBean")
@SessionScoped
public class CreatingClientManager implements Serializable {

/** Creates a new instance of CreatingClientManager */
public KreiranjeKorisnikaManager() {
    client= new Client();
    client.setAddress(new Address());
    cityList = new LinkedList<City>();
    cityList = Communication.getInstance().getCitySessionBeanRemote().getCities();
  }

private Client client;
private List<City> cityList;

public String startCreatingClent() {

    return "creating-client";
  }

/**
 * @return the client
 */
public Klijent getClient() {
    return client;
  }

/**
 * @param client the client to set
 */
public void setClient(Client client) {
    this.Client = client;
  }

/**
 * @return the cityList
 */
public List<Grad> getCityList() {
    return cityList;
  }

/**
 * @param cityList the cityList to set
 */
public void setCityList(List<City> cityList) {
    this.cityList = cityList;
  }

public String saveClient() {
    System.out.println("i am in saveClient method");
    String message = Communication.getInstance().getClientSessionBeanRemote.saveClient(client);
    FacesContext context = FacesContext.getCurrentInstance();
    kontekst.addMessage(message, new FacesMessage(FacesMessage.SEVERITY_INFO, "Success: ", message));
    return null;
  }
}

Und schließlich der Konverter:

   @FacesConverter(forClass=City.class, value="cityConverter")
   public class CityConverter implements Converter {

   @Override
   public Object getAsObject(FacesContext context, UIComponent component, String value) {
      Integer cityID = Integer.valueOf(value);
      CreatingClientManager kkm = (CreatingClientManager) ((HttpSession)context.getExternalContext().getSession(true)).getAttribute("kkmBean");
      List<Grad> cityList = kkm.getCityList();
      for (int i = 0; i < cityList.size(); i++) {
          City city = cityList.get(i);
          if(city.getCityID().equals(cityID)) {
              System.out.println(city.getCityName());
              return city;
          }
      }
      return null;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
      return value.toString();
  }
}

Das Problem liegt natürlich im selectOneMenu. Wenn ich das Formular abschicke, bekomme ich diesen ärgerlichen Fehler.

Ich war Debuggen Konverter und die Zeile vor der Rückkehr grad, ich drucken grad.getImeGrada() und alles ist gut, der Name (Ime) der gefundenen Stadt (grad) gedruckt wird. Übersehe ich etwas?

p.s. Entschuldigung für mein Englisch, ich hoffe, Sie verstehen, was mein Problem ist.

Beinahe vergessen zu erwähnen, dass ich equals und hashCode Methoden überschreiben, und ich bin sicher, es ist ok.

10voto

BalusC Punkte 1034465

Die Art und Weise, wie Sie die itemValue von <f:selectItems> und die Umsetzung der getAsString() des Konverters ist nicht richtig.

Wenn der ausgewählte Wert übermittelt wird, konvertiert JSF die cityID a City por getAsObject() des Konverters. Dann validiert JSF die City gegen die itemValue de la <f:selectItems> um zu sehen, ob es wirklich Teil der Liste ist (dies dient dazu, Hacker zu vermeiden, die Anfragen mit einem anderen Wert ändern/verfälschen). Da jedoch itemValue es cityID die ein Integer schlägt der Vergleich für jedes Element der Liste fehl. Daher ist die Value not valid Fehler.

Sie müssen sich ändern itemValue zu sein City und ändern Sie stattdessen getAsString() zur Rückgabe der cityID :

<p:selectOneMenu id="city" value="#{kkmBean.client.address.city}" style="width: 263px;" 
      converter="cityConveter" required="true" requiredMessage="You must choose one city">
      <f:selectItems value="#{kkmBean.cityList}" var="city" itemLabel="#{city.cityName}" itemValue="#{city}"/>
 </p:selectOneMenu>

et

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    City city = (City) value;
    return city.getCityID() != null ? String.valueOf(city.getCityID()) : null;
}

Zusammengefasst: die Art der itemValue muss sein genau dasselbe als Typ der Auswahlliste value und der Konverter muss zwischen genau diesem Typ und String konvertieren.

Siehe auch:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X