在getAsObject()方法中迭代PrimeFaces Autocomplete元素的建议列表

时间:2017-04-12 15:32:16

标签: primefaces autocomplete converter pojo

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

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

问题是我知道如何从POJO映射到String(getAsString()方法)但不知道如何从String映射到POJO(getAsObject()方法)。 / p>

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

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

如果有人可以解释如何从p:autocomplete方法访问getAsObject()元素的pojo建议列表,我真的很感激。

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

1 个答案:

答案 0 :(得分:0)

是的,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;
}