2016-04-24 4 views
0

Я пытаюсь применить JSF-конвертер к объекту внутри selectOneMenu, , но конвертер не распознается , я получаю это предупреждение в моем файле Xhtml,itemLabel = "# {projet.nomProjet}": свойство 'nomProjet' не найдено по типу java.lang.String

<<"nomProjet" cannot be resolved>> 

и когда я запустить приложение я получаю HTTP Error 500:

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

Вот мой код:

selectOneMenu я н мой взгляд

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

Преобразователь

@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")); 
    } 

} 
} 

И мой 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; 
} 
} 

Как это вызвано и как я могу решить эту проблему?

ответ

0

itemLabel = "# {projet.nomProjet}": Свойство 'nomProjet' не найден по типу java.lang.String

Это сообщение об ошибке указывает, что #{projet} находится во время выполнения фактически java.lang.String. Посмотрим, откуда #{projet}.

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

Таким образом, #{affectation.projetsAffectablesCollaborateur()} фактически вернулся List<String>. Если это непредвиденно, то остерегайтесь стирания стираемого типа и дважды проверяйте все неконтролируемые отбрасывания, которые типичный тип не ошибочно принят. Как правило, ошибка заключается в уровне персистентности.

Обратите внимание, что на этикетках элементов рендеринга вообще нет конвертера, поэтому показывать и обвинять не нужно. Конвертер используется только для значений элементов.