これが可能かどうかはわかりません...しかし、value属性がString型で、completeMethodが重いオブジェクトのリストを返すautoCompleteコンポーネントを使用したいと思います。
それは私が使用するための要件でもありますforceSelection="false"
これは私がうまくいくと思うものです(しかしうまくいきません):
<p:autoComplete id="it_demandeur"
value="#{utilisateurDemandeurCtrl.critereRechercheDemandeur}"
var="demandeurItem"
itemLabel="#{demandeurItem ne null ? demandeurItem.numeroOW.toString().concat(' - ').concat(demandeurItem.nom) : ''}"
itemValue="#{demandeurItem.nom}"
completeMethod="#{utilisateurDemandeurCtrl.completeDemandeur}"
minQueryLength="3"
cacheTimeout="10000">
<p:column>
#{demandeurItem.numeroOW} - #{demandeurItem.nom}
</p:column>
</p:autoComplete>
これは、提案のリストを返すメソッドです。
@SuppressWarnings("unchecked")
public List<Demandeur> completeDemandeur(String query) {
StringBuilder jpql = new StringBuilder(128);
jpql.append("SELECT d");
jpql.append(" FROM Demandeur d");
jpql.append(" WHERE UPPER(d.nom) LIKE :query");
jpql.append(" OR d.numeroOW LIKE :query");
Query demandeurQuery = em.createQuery(jpql.toString());
demandeurQuery.setParameter("query", "%" + query.toUpperCase() + "%");
return (List<Demandeur>) demandeurQuery.getResultList();
}
ユーザーが提案を選択すると、itemValue が選択された提案の名前に設定されますが、Demandeur オブジェクトからの 2 つの値を連結した文字列が表示されます。
候補が表示され、選択することはできますが、残念ながら、ページを送信するときに次のエラーが発生します。
例外メッセージ: /page/utilisateur.xhtml 行 27 および列 50 itemLabel="#{demandeurItem ne null ? demandeurItem.numeroOW.toString().concat(' - ').concat(demandeurItem.nom) : ''}" : プロパティ 'numeroOW' がタイプ java.lang.String で見つかりません
私の理解では、autoComplete コンポーネントの var 属性は提案のイテレーターであるため、私のタイプ Demandeur の場合は String ではありません。
どんな助けでも大歓迎です!
ありがとう
私はprimefaces 3.5.11、Websphere 8.5.5.0でのJSFのMyFaces実装を使用しています
編集:
これが私が試したコンバーターです
@FacesConverter(value = "demandeurUIConverter")
public class DemandeurConverter implements Serializable, Converter {
private static final long serialVersionUID = 1L;
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) throws ConverterException {
if (value == null || value.length() == 0) {
return null;
}
ConverterCtrl cc = EJB.lookup(ConverterCtrl.class);
Demandeur d = cc.getDemandeurFromCle(value);
if (d == null) {
d = new Demandeur();
d.setNom(value);
d.setNumeroOW(value);
}
return d;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) throws ConverterException {
if (value == null) {
return "";
}
Demandeur demandeur = (Demandeur) value;
return demandeur.getNom();
}
}