java - 具有不同值类型的建议和组件值的 Primefaces 自动完成组件

标签 java jsf primefaces

我不确定这是否可行...但我想使用自动完成组件,其中 value 属性的类型为 String 并且 completeMethod 返回一些重对象的列表。

使用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 个值的串联字符串。

建议确实出现了,我可以选择它们,但不幸的是,我在提交页面时遇到了这个错误:

Exception message: /page/utilisateur.xhtml at line 27 and column 50 itemLabel="#{demandeurItem ne null ? demandeurItem.numeroOW.toString().concat(' - ').concat(demandeurItem.nom) : ''}": Property 'numeroOW' not found on type java.lang.String

My understanding is that the var attribute of the autoComplete component is an iterator on the suggestions, so in my case of type Demandeur, not String.

Any help would be appreciated!

Thanks

I am using primefaces 3.5.11, MyFaces implementation for JSF on Websphere 8.5.5.0

Edit:

Here is the converter I tried with

@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();
   }

}

最佳答案

如果您为 Demandeur 制作一个转换器,这将起作用。

关于java - 具有不同值类型的建议和组件值的 Primefaces 自动完成组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259228/

相关文章:

maven - 安装primefaces所有主题后,“artifactory”服务器上缺少jar

java - 在将 Java 日期写入 SQL TIMESTAMP 列之前,JDBC 是否会将日期从 JVM 时区转换为数据库 session 时区?

java - 序列化 - 如何保护序列化的 JAVA 对象?

java - 使用 orElseThrow : Jacoco gives 0% code coverage 为Optional编写Mockito单元测试

jsf - 在 JSF 中使用 JSTL 函数

java - 计划作业上的 ScheduledExecutorService、timerService 和无状态 EJB

java - 访问 URL 时在 Tomcat 7 上按 IP 地址范围阻止访问

发生异常时的 JSF 响应代码

jsf-2 - 当方法执行更新时刷新延迟加载的 Primefaces 数据表

jsf - @ViewScoped 托管 bean 在回发期间多次加载