【问题标题】:Iterate suggestions list of PrimeFaces Autocomplete element within getAsObject() method在 getAsObject() 方法中迭代 PrimeFaces Autocomplete 元素的建议列表
【发布时间】:2017-09-08 11:46:05
【问题描述】:

我有一个 p:autoComplete PF 元素来处理 POJO 建议列表,我为此创建了一个 Converter 类来将 POJO 映射到字符串,反之亦然。

<p:autoComplete value="#{bean.pojoTargetList}" completeMethod="#{bean.getPOJOFilteredList}" var="pojo" itemLabel="#{pojo.name}"
itemValue="#{pojo}" converter="pojoConverter" />

问题是我知道如何从 POJO 映射到字符串 (getAsString()method),但不知道如何从字符串映射到 POJO (getAsObject()method)。

@FacesConverter("pojoConverter")
public class POJOConverter implements Converter {

@Override
public Object getAsObject(FacesContext arg0, UIComponent uiComponent, String value) {
    // ?        
    return pojo;
}

@Override
public String getAsString(FacesContext arg0, UIComponent uiComponent, Object assetTag) {
    String _return = null;
    ...
    return _return;
}

也许我错了,但我的理解是getAsObject() 方法的uiComponent 参数是对p:autoComplete PF 元素的引用。如果是这样,我可以访问 POJO 建议列表。因此,我可以对其进行迭代,并找到与value 参数匹配的 POJO 对象。

如果有人能解释我如何从 getAsObject() 方法访问 p:autocomplete 元素的 pojo 建议列表,我将不胜感激。

更新: 也许我错了,但我的理解是getAsObject() 方法的uiComponent 参数是对p:autoComplete PF 元素的引用。如果是这样,我可以访问bean.getPOJOFilteredList。因此,我可以迭代 bean.getPOJOFilteredList 并找到与 value 参数匹配的 POJO 对象。

【问题讨论】:

  • 为什么不只使用 Omnifaces 的转换器之一?他们已经考虑了这一切。

标签: primefaces autocomplete converter pojo


【解决方案1】:

是的,Converter 需要访问他预期返回的对象。实现可能如下所示:

@FacesConverter("userConverter")
public class UserConverter implements Converter {

    @Inject
    UserDirectory userDirectory;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uid) {
        return uid == null || uid.isEmpty() ? null : userDirectory.findByUid(uid);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object user) {
        final String uid = user instanceof User ? ((User) user).getUid() : null;
        return StringUtils.defaultIfEmpty(uid, "");
    }
}

自动完成方法必须独立实现,并应根据部分输入、不区分大小写等返回特定对象的列表:

public List<User> autoCompleteUser(String queryString) {

    // implement custom retrieval / filter logic

    return filteredUsers;
}

【讨论】:

  • 我要从getAsObject() 方法中的UIComponent 参数访问bean.getPOJOFilteredList。您的建议是使用注入的属性来访问此类列表。这不是我要找的。请查看我的更新。
  • 在您的情况下,具体的UIComponent 将是org.primefaces.component.autocomplete.AutoComplete 类型。其他组件在内部引用包含所有选项的模型,但autoComplete 使用completeMethod 动态接收它们。我怀疑 AutoComplete 是否包含对您的 bean 的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2012-03-22
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多