迭代getAsObject()方法中PrimeFaces自动完成元素的建议列表

迭代getAsObject()方法中PrimeFaces自动完成元素的建议列表,primefaces,autocomplete,converter,pojo,Primefaces,Autocomplete,Converter,Pojo,我有一个p:autoCompletePF元素来处理POJO建议列表,我为它创建了一个Converter类来将POJO映射为字符串,反之亦然 <p:autoComplete value="#{bean.pojoTargetList}" completeMethod="#{bean.getPOJOFilteredList}" var="pojo" itemLabel="#{pojo.name}" itemValue="#{pojo}" converter="pojoConverter" /&g

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

<p:autoComplete value="#{bean.pojoTargetList}" completeMethod="#{bean.getPOJOFilteredList}" var="pojo" itemLabel="#{pojo.name}"
itemValue="#{pojo}" converter="pojoConverter" />
也许我错了,但我的理解是
getAsObject()
方法的
uiComponent
参数是对
p:autoComplete
PF元素的引用。如果是这样,我可以访问POJO建议列表。因此,我可以对它进行迭代,并找到与
参数匹配的POJO对象

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

@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元素的引用。如果是这样,我可以访问
bean.getPOJOFilteredList
。因此,我可以迭代
bean.getPOJOFilteredList
并找到与
值匹配的POJO对象。

是的,
转换器需要访问他期望返回的对象。实现可能如下所示:

@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;
}
公共列表自动完成器(字符串查询字符串){
//实现自定义检索/过滤逻辑
回流过滤器;
}

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

@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的引用。我的出发点是从
getAsObject()
方法中的UIComponent参数访问
bean.getPOJOFilteredList
。您的建议是使用注入属性来访问这样的列表。这不是我要找的。请看我的更新。在您的情况下,具体的
UIComponent
将是
org.primefaces.component.autocomplete.autocomplete
类型。其他组件在内部引用包含所有选项的模型,但
autoComplete
使用
completeMethod
动态接收它们。我怀疑
AutoComplete
是否引用了您的bean。为什么不使用Omnifaces的转换器呢?他们已经考虑过了。为什么不使用Omnifaces的转换器呢?他们考虑过这一切。