我有一个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对象。
答案 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;
}