我正在返回的列表是javax.faces.model.SelectItem的列表,我真的不明白为什么我需要为此创建一个转换器,但让我们继续.我创建了一个简单的转换器来测试,但是primefaces无法识别我的转换器并在浏览器中返回此错误:
/resources/components/popups/popupBuscaPessoa.xhtml @35,41 itemLabel=”#{pessoa.label}”: The class ‘java.lang.String’ does not have the property ‘label’.
这是我的转换课程(只是为了测试):
public class ConversorSelectItem implements Converter { @Override public Object getAsObject(FacesContext context,UIComponent component,String value) { if (value!=null && value.isEmpty()) return null; SelectItem selectItem=new SelectItem(); selectItem.setLabel(value); return selectItem; } @Override public String getAsString(FacesContext context,Object object) { return ((SelectItem)object).getLabel(); } }
这是我尝试使用p:autocomplete的地方:
<p:autoComplete value="#{modeloPopupBuscaPessoa.itemSelecionado}" completeMethod="#{controladorSugestaoPessoa.atualizarSugestoes}" var="pessoa" itemLabel="#{pessoa.label}" itemValue="#{pessoa.value}" converter="#{conversorSelectItem}"/>
我做错了什么吗?是否有SelectItem的默认转换器?有没有更简单的方法来实现这个转换器?
解决方法
只要您使用itemValue =“#{pessoa}”并且#{modeloPopupBuscaPessoa.itemSelecionado}引用Pessoa属性,转换器就是必需的.然后,您应该在getAsString()中将Pessoa转换为其唯一的String表示形式(以便可以用HTML打印),并在getAsObject()中将String转换为Pessoa(以便可以在bean属性中设置).
但是,如果#{pessoa.value}是一个字符串并且#{modeloPopupBuscaPessoa.itemSelecionado}也是一个字符串,那么你应该只使用itemValue =“#{pessoa.value}”并完全删除转换器.
也可以看看:
> PrimeFaces showcase: <p:autoComplete>
with POJO
> Can I use omnifaces generic converter in primefaces autocomplete component?
> Conversion Error setting value for ‘null Converter’