javax.el.PropertyNotFoundException:itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到

Posted

技术标签:

【中文标题】javax.el.PropertyNotFoundException:itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到属性“nomProjet”【英文标题】:javax.el.PropertyNotFoundException: itemLabel="#projet.nomProjet": Property 'nomProjet' not found on type java.lang.Stringjavax.el.PropertyNotFoundException:itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到属性“nomProjet” 【发布时间】:2016-08-17 17:06:08 【问题描述】:

我正在尝试将 JSF 转换器应用于 selectOneMenu 内的实体, 但转换器无法识别,我在我的 xhtml 文件中收到此警告,

<<"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;


这是怎么引起的,我该如何解决?

【问题讨论】:

【参考方案1】:

itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到属性“nomProjet”

此错误消息告诉#projet 在运行时实际上是java.lang.String。让我们看看#projet是从哪里来的。

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

因此,#affectation.projetsAffectablesCollaborateur() 实际上返回了一个List&lt;String&gt;。如果这是出乎意料的,那么请注意泛型类型擦除并仔细检查所有未检查的强制转换,以确保没有错误地假定泛型类型。通常,错误出现在持久层中。例如,当您错误地执行查询SELECT p.nomProject FROM Project p 而不是SELECT p FROM Project p,然后对List&lt;Projet&gt; 而不是List&lt;String&gt; 执行未经检查的强制转换。

请注意,渲染项目标签根本不涉及转换器,因此没有必要展示和指责它。转换器仅用于项目值。

【讨论】:

以上是关于javax.el.PropertyNotFoundException:itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到的主要内容,如果未能解决你的问题,请参考以下文章