p:dataTable javax.el.ELException: selection="#{testBean.selectedBook} 无法从对象转换为书籍
p:dataTable javax.el.ELException: selection="#{testBean.selectedBook} cannot convert from Object To Book
我有一个single
select离子table,当我select一行时,出现这个异常:
com.sun.faces.context.PartialViewContextImpl.processPartial javax.el.ELException: /Test.xhtml @18,79 selection="#{testBean.selectedBook}": Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
javax.el.ELException: /Test.xhtml @18,79 selection="#{testBean.selectedBook}": Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
Caused by: javax.el.ELException: Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
这是我的书 table:
<h:form>
<p:dataTable id="singleDT" var="item" value="#{testBean.booksList}" selectionMode="single"
selection="#{testBean.selectedBook}" rowKey="#{item[0]}">
<p:ajax event="rowSelect" listener="#{testBean.onRowSelect}"/>
<p:ajax event="rowUnselect" listener="#{testBean.onRowUnselect}"/>
<p:column headerText="Id">
<h:outputText value="#{item[0]}"/>
</p:column>
<p:column headerText="Title">
<h:outputText value="#{item[1]}"/>
</p:column>
<f:facet name="footer">
<p:commandButton process="singleDT" icon="ui-icon-search" value="View" action="#{testBean.showPlease}"/>
</f:facet>
</p:dataTable>
</h:form>
这是 testBean
:
private List<Book> booksList;
private Book selectedBook;
public Book getSelectedBook() {
return selectedBook;
}
public void setSelectedBook(Book selectedBook) {
this.selectedBook = selectedBook;
}
public void onRowSelect(SelectEvent event) {
System.out.println("row selected, " + event.getObject()); // displays [Ljava.lang.Object;@62699e1d
}
public void onRowUnselect(UnselectEvent event) {
System.out.println("row Unselected");
}
@Transactional
public List<Book> allBooks() {
// fill the list with hibernate
return booksList;
}
//getter/setters
我将 selected 行分配给 selectedBook
错误是无法从类型 object
转换为 Book
类型。
selectedBook
变量类型是Book
,但是哪个变量是object
导致这个错误?
如果您查看完整的堆栈跟踪,您很可能会发现错误出在您的代码中。您可以而且应该自己轻松调查类转换异常
作为副节点:
value="#{testBean.booksList}"
指的是您的 bean 中未显示在您发布的 bean 代码中的方法(但非常非常相关,因为该列表中的单个项目是在选择中)
- 你知道
p:dataTable works
是怎么回事吗?我想不是。查看 PF 展示并检查它的所有差异功能并检查源代码并与您的进行比较
- 您不仅应该学习一些基本的jsf/jpa,还应该学习基本的开发技能
你是泛型擦除的受害者。
你的 List<Book> bookList
实际上 被 List<Object[]>
填充,而不是 List<Book>
。您的 JSF 页面中的 #{item[0]}
、#{item[1]}
等没有抛出 EL 异常这一事实证实了这一点。你知道,因为你之前的问题 和链接副本中的答案。
您需要修复 Hibernate 查询,使其 return 成为真正的 List<Book>
,而不是 List<Object[]>
。例如,您需要在创建查询时执行 SELECT b FROM Book b
而不是 SELECT b.id, b.title FROM Book b
并将 Book.class
设置为 return class。您不需要在 (List<Book>)
上添加强制转换。有点理智的 IDE 会显示一个未经检查的强制转换警告。这应该已经表明这里可能有问题。
修复 Hibernate 查询后,您需要确保以下测试用例在没有 ClassCastException
的情况下成功运行:
List<Book> books = callYourHibernateQueryHere();
for (Book book : books) {
System.out.println(book.getTitle());
}
才可以使用rowKey="#{item.id}"
、#{item.id}
、#{item.title}
等
重要提示,这个问题在技术上与 JSF 无关。当以不同的方式呈现 Hibernate 结果时,您会遇到完全相同的问题,例如使用上面演示的 System.out.println()
。
如果出于某种原因无法修复 Hibernate 查询,那么您需要将 JSF 托管 bean 中的所有位置的 Book
替换为 Object[]
。例如。 List<Object[]> bookList
、Object[] selectedBook
等。不用说这是个糟糕的主意。
我有一个single
select离子table,当我select一行时,出现这个异常:
com.sun.faces.context.PartialViewContextImpl.processPartial javax.el.ELException: /Test.xhtml @18,79 selection="#{testBean.selectedBook}": Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
javax.el.ELException: /Test.xhtml @18,79 selection="#{testBean.selectedBook}": Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
Caused by: javax.el.ELException: Cannot convert [Ljava.lang.Object;@5b9b0639 of type class [Ljava.lang.Object; to class com.obs.model.Book
这是我的书 table:
<h:form>
<p:dataTable id="singleDT" var="item" value="#{testBean.booksList}" selectionMode="single"
selection="#{testBean.selectedBook}" rowKey="#{item[0]}">
<p:ajax event="rowSelect" listener="#{testBean.onRowSelect}"/>
<p:ajax event="rowUnselect" listener="#{testBean.onRowUnselect}"/>
<p:column headerText="Id">
<h:outputText value="#{item[0]}"/>
</p:column>
<p:column headerText="Title">
<h:outputText value="#{item[1]}"/>
</p:column>
<f:facet name="footer">
<p:commandButton process="singleDT" icon="ui-icon-search" value="View" action="#{testBean.showPlease}"/>
</f:facet>
</p:dataTable>
</h:form>
这是 testBean
:
private List<Book> booksList;
private Book selectedBook;
public Book getSelectedBook() {
return selectedBook;
}
public void setSelectedBook(Book selectedBook) {
this.selectedBook = selectedBook;
}
public void onRowSelect(SelectEvent event) {
System.out.println("row selected, " + event.getObject()); // displays [Ljava.lang.Object;@62699e1d
}
public void onRowUnselect(UnselectEvent event) {
System.out.println("row Unselected");
}
@Transactional
public List<Book> allBooks() {
// fill the list with hibernate
return booksList;
}
//getter/setters
我将 selected 行分配给 selectedBook
错误是无法从类型 object
转换为 Book
类型。
selectedBook
变量类型是Book
,但是哪个变量是object
导致这个错误?
如果您查看完整的堆栈跟踪,您很可能会发现错误出在您的代码中。您可以而且应该自己轻松调查类转换异常
作为副节点:
value="#{testBean.booksList}"
指的是您的 bean 中未显示在您发布的 bean 代码中的方法(但非常非常相关,因为该列表中的单个项目是在选择中)- 你知道
p:dataTable works
是怎么回事吗?我想不是。查看 PF 展示并检查它的所有差异功能并检查源代码并与您的进行比较 - 您不仅应该学习一些基本的jsf/jpa,还应该学习基本的开发技能
你是泛型擦除的受害者。
你的 List<Book> bookList
实际上 被 List<Object[]>
填充,而不是 List<Book>
。您的 JSF 页面中的 #{item[0]}
、#{item[1]}
等没有抛出 EL 异常这一事实证实了这一点。你知道,因为你之前的问题 和链接副本中的答案。
您需要修复 Hibernate 查询,使其 return 成为真正的 List<Book>
,而不是 List<Object[]>
。例如,您需要在创建查询时执行 SELECT b FROM Book b
而不是 SELECT b.id, b.title FROM Book b
并将 Book.class
设置为 return class。您不需要在 (List<Book>)
上添加强制转换。有点理智的 IDE 会显示一个未经检查的强制转换警告。这应该已经表明这里可能有问题。
修复 Hibernate 查询后,您需要确保以下测试用例在没有 ClassCastException
的情况下成功运行:
List<Book> books = callYourHibernateQueryHere();
for (Book book : books) {
System.out.println(book.getTitle());
}
才可以使用rowKey="#{item.id}"
、#{item.id}
、#{item.title}
等
重要提示,这个问题在技术上与 JSF 无关。当以不同的方式呈现 Hibernate 结果时,您会遇到完全相同的问题,例如使用上面演示的 System.out.println()
。
如果出于某种原因无法修复 Hibernate 查询,那么您需要将 JSF 托管 bean 中的所有位置的 Book
替换为 Object[]
。例如。 List<Object[]> bookList
、Object[] selectedBook
等。不用说这是个糟糕的主意。