Вы кормите от 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}" />
Или, если вы нацелены на контейнер с сервлетом 3.0 / EL 2.2, который позволяет вызывать методы, не являющиеся получателями, так что вы можете использовать Map#values()
, чтобы получить Collection<Contact>
:
<f:selectItems value="#{contactsHolder.contacts.values()}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />
Или, вместо этого, сделайте #{contactsHolder.contacts}
a List<Contact>
, чтобы ваш первоначальный код представления работал:
<f:selectItems value="#{contactsHolder.contacts}" var="contact"
itemLabel="#{contact.firstName}" itemValue="#{contact}" />