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<String>
。如果这是出乎意料的,那么请注意泛型类型擦除并仔细检查所有未检查的强制转换,以确保没有错误地假定泛型类型。通常,错误出现在持久层中。例如,当您错误地执行查询SELECT p.nomProject FROM Project p
而不是SELECT p FROM Project p
,然后对List<Projet>
而不是List<String>
执行未经检查的强制转换。
请注意,渲染项目标签根本不涉及转换器,因此没有必要展示和指责它。转换器仅用于项目值。
【讨论】:
以上是关于javax.el.PropertyNotFoundException:itemLabel="#projet.nomProjet":在 java.lang.String 类型上找不到的主要内容,如果未能解决你的问题,请参考以下文章