p:autoComplete itemLabel抛出"类'java.lang.String'没有属性'label'."

bre*_*leq 7 jsf label converters primefaces jsf-2

我正在从IceFaces变为PrimeFaces(我真的想改为RichFaces,但导致新版本中出现错误,我不会)并且我正在努力实现正确的primefaces autoComplete.根据他的手册,我只需要实现一个返回对象列表的方法,在这种情况下需要一个转换器.

我正在返回的列表是javax.faces.model.SelectItem的列表,我真的不明白为什么我需要为此创建一个转换器,但让我们继续.我创建了一个简单的转换器来测试,但是primefaces无法识别我的转换器并在浏览器中返回此错误:

/resources/components/popups/popupBuscaPessoa.xhtml @ 35,41 itemLabel ="#{pessoa.label}":类'java.lang.String'没有属性'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, UIComponent component, Object object) {
    return ((SelectItem)object).getLabel();
}
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试使用p:autocomplete的地方:

<p:autoComplete value="#{modeloPopupBuscaPessoa.itemSelecionado}"
            completeMethod="#{controladorSugestaoPessoa.atualizarSugestoes}"
            var="pessoa" itemLabel="#{pessoa.label}" itemValue="#{pessoa.value}"
            converter="#{conversorSelectItem}"/>
Run Code Online (Sandbox Code Playgroud)

我做错什么了吗?是否有SelectItem的默认转换器?有没有更简单的方法来实现这个转换器?

Bal*_*usC 13

你不应该用它喂它List<SelectItem>.你应该用它喂它List<Pessoa>.你也不应该专注于转换SelectItem.您应该专注于转换项目值,即Pessoa.这SelectItem是旧JSF 1.x时代的遗留物.在JSF 2.x中,这是不是强制性的了,感谢var,itemValueitemLabel在视图属性.这样可以使bean保持清洁,避免特定于视图的混乱.

Converter每次使用只需要itemValue="#{pessoa}"#{modeloPopupBuscaPessoa.itemSelecionado}是指一个Pessoa属性.然后,您应该getAsString()转换Pessoa为其唯一的String表示形式(以便可以用HTML打印)和getAsObject()转换StringPessoa(以便可以在bean属性中设置).

但是,如果#{pessoa.value}是a String并且#{modeloPopupBuscaPessoa.itemSelecionado}也是a String,那么你应该只使用itemValue="#{pessoa.value}"和删除Converter.

也可以看看:


Mak*_*kky 6

可用于Primefaces自动完成的通用转换器以及所有其他用途:

import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import java.util.WeakHashMap;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    private static Map<Object, String> entities = new WeakHashMap<Object, String>();

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object entity) {
        synchronized (entities) {
            if (!entities.containsKey(entity)) {
                String uuid = UUID.randomUUID().toString();
                entities.put(entity, uuid);
                return uuid;
            } else {
                return entities.get(entity);
            }
        }
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) {
        for (Entry<Object, String> entry : entities.entrySet()) {
            if (entry.getValue().equals(uuid)) {
                return entry.getKey();
            }
        }
        return null;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,实体地图会随着时间的流逝而填满吗?什么时候清理?(=记忆猪) (2认同)