我不确定这是否可能......但我想使用 autoComplete 组件,其中 value 属性是 String 类型,而 completeMethod 返回一些重对象的 List 。
这也是我使用的要求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) : ''}" : 在 java.lang.String 类型上找不到属性“numeroOW”
我的理解是 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();
}
}