JSF 2 <f :selectItems> not recognizing itemLabel and itemValue attributes

标签 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...
}

最佳答案

您正在喂食 Map<String, Contact><f:selectItems value> . var中的每一项属性将是 Map.Entry<String, Contact> 只有 getKey()getValue()返回 String 的方法映射键和 Contact分别映射值。 Map.Entry类(class)确实没有 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>相反,您的初始 View 代码将起作用:
<f:selectItems value="#{contactsHolder.contacts}" var="contact"
    itemLabel="#{contact.firstName}" itemValue="#{contact}" />

关于JSF 2 <f :selectItems> not recognizing itemLabel and itemValue attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7640973/

相关文章:

jsf-2 - primefaces 可编辑数据表中的 EnumConverter

java - JSF 1.2,是否有任何实用程序可以学习它是如何工作的?

JSF f :viewParam not calling setter if located in template. xhtml

java - JSF 2.0 - 移动和 PC 浏览器的两个界面

java - 我可以将 ".jar"导入 JSF 并使用它吗?

java - 适用的设计模式

java - Facelets 中的 Spring Security 注销链接

java - 将值从表单提交到方法,无需在 BackingBean 中使用变量

java - 无法将 HTML 添加到 <ui :define>

jsf-2 - JSF facelets 模板打包