0

selectOneMenu 内のエンティティに JSF コンバーターを適用しようとしていますが、コンバーターが認識されません。xhtml ファイルに次の警告が表示されます。

<<"nomProjet" cannot be resolved>>

アプリケーションを実行すると、 Error 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;
}
}

これはどのように発生し、どうすれば解決できますか?

4

1 に答える 1

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()}実際には a が返されList<String>ます。これが予期しない場合は、ジェネリック型の消去に注意し、ジェネリック型が誤って想定されていないすべての未チェックのキャストを再確認してください。一般に、間違いは永続層にあります。たとえば、誤って のSELECT p.nomProject FROM Project p代わりにクエリを実行し、代わりにSELECT p FROM Project pに対して未チェックのキャストを実行した場合などです。List<Projet>List<String>

アイテム ラベルのレンダリングにはコンバーターがまったく関与しないことに注意してください。コンバーターは、アイテムの値に対してのみ使用されます。

于 2016-04-24T14:30:56.053 に答える