2015-06-04 3 views
0

Я хочу создать меню флажка и отобразить данные в списке данных. Вот мой XHTML:PrimeFaces p: dataList выдает ошибку «Свойство« ime »не найдено по типу java.lang.String«

<h:form> 
<h:panelGrid columns="3" cellpadding="5"> 
    <h:outputLabel for="menu" value="Demonstratori :" /> 
    <p:selectCheckboxMenu id="menu" value="#{nastavnik.odabraniDemonstratori}" label="Demonstratori:" 
            filter="true" filterMatchMode="startsWith" panelStyle="width:250px"> 
     <f:selectItems value="#{nastavnik.sviDemonstratori}" var="demons" itemLabel="#{demons.ime} #{demons.prezime}" itemValue="#{demons}" /> 
    </p:selectCheckboxMenu> 
    <p:commandLink value="Submit" update="display" /> 
</h:panelGrid> 

    <p:outputPanel id="display" style="width:250px;padding-left:5px;margin-top:10px"> 
     <p:dataList value="#{nastavnik.odabraniDemonstratori}" var="d" type="ordered" emptyMessage="Nema odabranih demonstratora"> 
      #{d.ime}" 
     </p:dataList> 
    </p:outputPanel> 
</h:form> 

Здесь важен код из фасоли наставник:

private ArrayList<Demonstrator> odabraniDemonstratori; 
public void setOdabraniDemonstratori(ArrayList<Demonstrator> odabraniDemonstratori) { 
    this.odabraniDemonstratori = odabraniDemonstratori; 
} 


public ArrayList<Demonstrator> getOdabraniDemonstratori() { 
    return odabraniDemonstratori; 
} 

Демонстратор боб имеет свойство ime. Все работает хорошо, но когда я пытаюсь показать данные в DataList с #{d.ime}, я получаю эту ошибку:

/unoslabvezbe.xhtml @84,49 value="#{d.ime}": Property 'ime' not found on type java.lang.String 

d свойства типа Демонстратор не строка. Любая помощь ?

+0

является ' Демонстрант a публичный класс? – DavidS

+0

Да его спящий фасоль: @Entity Публичный класс Демонстрант распространяется на Korisnik – user3364181

+0

Работает ли он с более простым примером? например Просто верните 'ArrayList '? Это просто предложение отладки, а не «решение». – DavidS

ответ

2

При использовании компонента выбора (например, p:selectCheckboxMenu или p:pickList), вам нужен конвертер для обработки сложных (= не простая строка) Java объекты в качестве значений f:selectItems. Конвертер будет сериализовать и десериализовать ваш объект Demonstrator.

Поэтому вам нужно добавить атрибут converter для p:selectCheckboxMenu и ссылаться на свой собственный конвертер, или даже лучше, использовать готовую к использованию SelectItemsConverter (showcase link), предоставляемого Omnifaces, отличная утилита библиотеки для разработчиков JSF (установка просто: добавьте файл .jar или добавьте новую зависимость в Maven).

<p:selectCheckboxMenu id="menu" value="#{nastavnik.odabraniDemonstratori}" converter="omnifaces.SelectItemsConverter" label="Demonstratori:" filter="true" filterMatchMode="startsWith" panelStyle="width:250px"> 
    <f:selectItems value="#{nastavnik.sviDemonstratori}" var="demons" itemLabel="#{demons.ime} #{demons.prezime}" itemValue="#{demons}" /> 
</p:selectCheckboxMenu> 

Примечание: Для того, чтобы узнать больше о разработке собственного конвертера (не путь):

+0

Это не тот случай, Матье. Вы можете получить доступ к основным свойствам (String, Integer и т. Д.) Сложного объекта без записи конвертера для сложного объекта. Я только что проверил это локально, используя 'p: dataList', и он работает так, как ожидалось. – DavidS

+0

Речь идет не о доступе к свойствам сложных объектов в 'p: dataList', а об установке этих объектов (что будет действительно отображаться в компоненте' p: dataList') благодаря компоненту выбора ('p: selectCheckboxMenu' в этом case) –

+0

Это хороший момент, Mathieu, но сообщение об ошибке, отправленное OP, жалуется на '' {d.ime} ', которое является выражением, которое он использовал за пределами' p: selectCheckboxMenu'.Хм, но я думаю, что отсутствие конвертера может вызвать это, не так ли? Если конвертер по умолчанию рассматривает его как строку, то, возможно, отсутствие конвертера вызывает это сообщение об ошибке. (Я не могу удалить свой downvote, если вы не отредактируете свой ответ.) – DavidS

Смежные вопросы