JSF 2无法识别 itemLabel 和 itemValue 属性

发布于 2024-12-07 17:57:52 字数 1429 浏览 2 评论 0原文

我在 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...
}

I have the following dropdown in a Facelets page:

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

The problem is, no matter what I put in for itemLabel (JSF EL expression or just plain text), it doesn't display. Any idea what I'm doing wrong?

Here's 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...
}

And 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...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

铁憨憨 2024-12-14 17:57:52

您正在向 提供 Mapvar 属性中的每个项目都是 < code>Map.Entry仅具有返回 String< 的 getKey()getValue() 方法/code> 地图键和 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

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

或者,将 #{contactsHolder.contacts} 设为 List,以便您的初始视图代码正常工作:

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

You're feeding a Map<String, Contact> to <f:selectItems value>. Each item in var attribute will be a Map.Entry<String, Contact> which has only getKey() and getValue() methods returning the String map key and Contact map value respectively. The Map.Entry class indeed doesn't have a getFirstName() method.

Fix it accordingly:

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

Or, if you target a Servlet 3.0 / EL 2.2 capable container which allows invoking non-getter methods, so that you can use Map#values() to get a Collection<Contact>:

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

Or, make the #{contactsHolder.contacts} a List<Contact> instead so that your initial view code will work:

<f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文