p: dataList не может перебрать java.util.Set - PullRequest
4 голосов
/ 11 марта 2011

У меня есть файл dataList из набора простых лиц внутри dataGrid, но у меня возникла проблема с отображением свойства вложенной коллекции dataList (java.util.Set).Когда я ссылаюсь на любой атрибут во вложенном наборе (dream.tag), я получаю исключение:

javax.servlet.ServletException: /registered/modify.xhtml @ 42,48 value = "# {tag.id} ": Свойство 'id' не найдено для типа org.hibernate.collection.PersistentSet.

Этот атрибут есть, но атрибут dream.tag сопоставлен с частным тегом Set.Можно ли использовать компонент dataList с Set.Я скопировал схему моей модели данных ниже.Спасибо за помощь!

<p:dataGrid var="dream" value="#{dreamModifyBean.dreams}" columns="5"  rows="10" paginator="true" effect="true"  paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="10,15,20" paginatorPosition="bottom"> 
    <p:column>  
        <h:panelGrid columns="1" style="width:100%"> 
            <h:outputText value="#{dream.order}. #{dream.title}"/><br/>
            <p:graphicImage value="#{dream.imageThumb}" width="125" height="100"/><br/>
            <h:outputText value="#{dream.notes}"/><br/>
            <p:dataList value="#{dream.tag}" var="tag">  
                <h:outputText value="#{tag.id}"/>
            </p:dataList> 
            <h:outputText value="#{bundle['dreamModify.cost.TEXT']} #{dream.cost}"/><br/>
        </h:panelGrid>  
    </p:column>  
</p:dataGrid>

Мечта (dreamModifyBean.dreams) - Родитель:

public class Dream implements Serializable{
 @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
 @JoinColumn(name="DREAM_ID")
 private Set<Tag> tag;

public Set<Tag> getTag() {
    return tag;
}
public void setTag(Set<Tag> tag) {
    this.tag = tag;
}
}

Метка (dream.tag) - Ребенок

public class Tag {
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Basic(optional=false)
 @Column(name="ID")
 private Long id;
 @Basic(optional=false)
 @Column(name="DESCRIPTION")
 private String description;
 @ManyToOne(fetch=FetchType.EAGER)
 @JoinColumn(name="DREAM_ID")
 private Dream dream;

 public Long getId() {
    return id;
 }
 public void setId(Long id) {
    this.id = id;
 }
 public String getDescription() {
    return description;
 }
 public void setDescription(String description) {
    this.description = description;
 }
public Dream getDream() {
    return dream;
}
public void setDream(Dream dream) {
    this.dream = dream;
}
}

Ответы [ 3 ]

9 голосов
/ 14 марта 2011

Попробуйте использовать List.Атрибут value должен быть одним из следующих, как описано здесь :

  • список бинов
  • массив бинов
  • одинbean
  • объект javax.faces.model.DataModel
  • объект java.sql.ResultSet
  • объект javax.servlet.jsp.jstl.sql.Result
  • объект javax.sql.RowSet
2 голосов
/ 16 апреля 2014

Вы можете использовать метод toArray () из Set:

<p:dataList value="#{dream.tag.toArray}" var="tag">  
    <h:outputText value="#{tag.id}" />
</p:dataList>
1 голос
/ 30 марта 2011

У меня точно такая же проблема, и я предполагаю ошибку в реализации простых лиц (в ней четко указано, что она перебирает коллекции).Кстати, кажется, что он не работает, пока он отображает конечный тег, а не сам список.

(не полностью удовлетворяющий) обходной путь - добавить вспомогательный метод:

public List<Tag> getTagsAsList() {
    return new ArrayList<Tag>(tags);
}

@ Matt Handy: Набор может определенно быть упорядоченным, некоторые реализации (например, TreeSet), другие - нет (например, HashSet).Основное различие между Set и List заключается в обработке дубликатов.

Edit : я был слишком быстр, чтобы обвинить Primefaces.Похоже, корень проблемы лежит в самой реализации JSF, которая не предоставляет DataModel для наборов.Смотрите здесь для более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...