JSF 2 <f:selectitems>无法识别itemLabel和itemValue属性</f:selectitems>

时间:2011-10-03 21:37:49

标签: jsf jsf-2 facelets el

我在Facelets页面中有以下下拉列表:

<h:selectOneMenu value="#{contactBean.selectedContact}" converter="#{contactConverter}">
    <f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />
</h:selectOneMenu>

问题是,无论我为itemLabel(JSF EL表达式还是纯文本)放入什么,它都不会显示。知道我做错了吗?

这是ContactConverter

@ManagedBean(name = "contactConverter")
@RequestScoped
public class ContactConverter implements Converter, Serializable {
    @ManagedProperty(value = "#{contactsHolder}")
    private ContactsHolder contactsHolder;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return contactsHolder.getContacts().get(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return ((Contact) value).getContactID();
    }
    //getter & setters...
}

ContactsHolder

@ManagedBean
@SessionScoped
public class ContactsHolder implements Serializable {
    private Map<String, Contact> contacts;

    @PostConstruct
    public void init() {
        contacts = new LinkedHashMap<String, Contact>();
        //get Contacts data and populate map...
    }
    //getters & setters...
}

1 个答案:

答案 0 :(得分:12)

您正在向Map<String, Contact>提供<f:selectItems value>var属性中的每个项目都是Map.Entry<String, Contact>,其中只有getKey()getValue()方法分别返回String地图关键字和Contact地图值。 Map.Entry类确实没有getFirstName()方法。

相应修复:

<f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.value.firstName}" itemValue="#{contact.value}" />

或者,如果您的目标是支持Servlet 3.0 / EL 2.2的容器,该容器允许调用非getter方法,那么您可以使用Map#values()来获取Collection<Contact>

<f:selectItems value="#{contactsHolder.contacts.values()}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />

或者,将#{contactsHolder.contacts}改为List<Contact>,以便初始查看代码能够正常运行:

<f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />