2016-04-24 3 views
0

Ich versuche, in einem selectOneMenu, einen JSF-Wandler auf eine Entität anzuwenden, sondern der Konverter nicht erkannt wird , bekomme ich diese Warnung in meinem xhtml-Datei,ITEMLABEL = „# {projet.nomProjet}“: Property ‚nomProjet‘ nicht auf Typen java.lang.String gefunden

<<"nomProjet" cannot be resolved>> 

und wenn ich die Anwendung ausführen ich Fehler HTTP immer 500:

itemLabel="#{projet.nomProjet}": Property 'nomProjet' not found on type java.lang.String 

Hier ist mein Code:

die selectOneMenu i n meiner Sicht

<p:selectOneMenu id="projet" converter="projetConverter" value="# {affectation.selectedProjet}" > 
           <f:selectItems var="projet" itemValue="#{projet}" itemLabel="#{projet.nomProjet}" value="#{affectation.projetsAffectablesCollaborateur()}" /> 
          </p:selectOneMenu> 

Der Konverter

@Component 
@FacesConverter("projetConverter") 
public class ProjetConverter implements Converter { 

@Autowired 
private ProjetRepository projetRepository; 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (value == null || value.isEmpty()) { 
     return null; 
    } 

    try { 
     Projet projet = projetRepository.findByIdProjet(Long.valueOf(value)); 
     return projet; 
    } catch (NumberFormatException exception) { 
     throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur de conversion", "ID de projet invalide")); 
    } 

} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (value == null) { 
     return ""; 
    } 

    if (value instanceof Projet) { 
     return String.valueOf(((Projet) value).getIdProjet()); 
    } else { 
     throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur de conversion", "Instance de projet invalide")); 
    } 

} 
} 

Und mein Entity:

@Entity 
@NamedQuery(name = "Projet.findAll", query = "SELECT p FROM Projet p") 
public class Projet implements Serializable { 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long idProjet; 

private String nomProjet; 
@Transient 
private List<Role> listRoles = new ArrayList<Role>(); 

public List<Role> getListRoles() { 
    return listRoles; 
} 

public void setListRoles(List<Role> listRoles) { 
    this.listRoles = listRoles; 
} 

// bi-directional many-to-one association to AffectationProjetRole 
@OneToMany(mappedBy = "projet") 
private List<AffectationProjetRole> affectationProjetRoles; 

public Projet() { 
} 

public Projet(String nomProjet) { 
    this.nomProjet = nomProjet; 
} 

public long getIdProjet() { 
    return this.idProjet; 
} 

public void setIdProjet(long idProjet) { 
    this.idProjet = idProjet; 
} 

public String getNomProjet() { 
    return this.nomProjet; 
} 

public void setNomProjet(String nomProjet) { 
    this.nomProjet = nomProjet; 
} 

public List<AffectationProjetRole> getAffectationProjetRoles() { 
    return this.affectationProjetRoles; 
} 

public void setAffectationProjetRoles(List<AffectationProjetRole> affectationProjetRoles) { 
    this.affectationProjetRoles = affectationProjetRoles; 
} 

public AffectationProjetRole addAffectationProjetRole(AffectationProjetRole affectationProjetRole) { 
    getAffectationProjetRoles().add(affectationProjetRole); 
    affectationProjetRole.setProjet(this); 

    return affectationProjetRole; 
} 

public AffectationProjetRole removeAffectationProjetRole(AffectationProjetRole affectationProjetRole) { 
    getAffectationProjetRoles().remove(affectationProjetRole); 
    affectationProjetRole.setProjet(null); 

    return affectationProjetRole; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (int) (idProjet^(idProjet >>> 32)); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Projet other = (Projet) obj; 
    if (idProjet != other.idProjet) 
     return false; 
    return true; 
} 
} 

Wie wird diese verursacht und wie kann ich sie lösen?

Antwort

0

ITEMLABEL = "# {projet.nomProjet}": Property 'nomProjet' nicht auf Typ java.lang.String gefunden

Diese Fehlermeldung besagt, dass #{projet} während der Laufzeit ist eigentlich ein java.lang.String. Lass uns schauen, wo #{projet} herkommt.

<f:selectItems value="#{affectation.projetsAffectablesCollaborateur()}" 
    var="projet" itemValue="#{projet}" itemLabel="#{projet.nomProjet}" /> 

So #{affectation.projetsAffectablesCollaborateur()} kehrte tatsächlich eine List<String>. Wenn dies unerwartet ist, dann hüten Sie sich vor dem generischen Typ des Löschens und überprüfen Sie alle nicht markierten Umwandlungen, bei denen der generische Typ nicht falsch angenommen wird. Im Allgemeinen liegt der Fehler in der Persistence-Schicht.

Beachten Sie, dass das Rendern von Elementbeschriftungen den Konverter überhaupt nicht betrifft, so dass das Anzeigen und Beschuldigen unnötig ist. Der Konverter wird nur für Artikelwerte verwendet.

Verwandte Themen