2016-04-24 60 views
0

我試圖將JSF轉換器應用於selectOneMenu中的實體, 但轉換器無法識別,我在XHTML文件得到這樣的警告,itemLabel =「#{projet.nomProjet}」:在java.lang.String類型中找不到的屬性'nomProjet'

<<"nomProjet" cannot be resolved>> 

,當我跑我得到錯誤HTTP 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 
@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>。如果這是意想不到的,那麼要小心泛型類型的擦除,並且檢查所有未檢查的強制類型是否被錯誤地假設。一般來說,這個錯誤在於persitence層。

請注意,渲染項目標籤根本不涉及轉換器,因此顯示和歸咎它是沒有必要的。轉換器僅用於項目值。

相關問題