【问题标题】:p:dataTable javax.el.ELException: selection="#{testBean.selectedBook} cannot convert from Object To Bookp:dataTable javax.el.E​​LException: selection="#{testBean.selectedBook} 无法从 Object To Book 转换
【发布时间】:2015-07-11 02:51:23
【问题描述】:

我有一个single 选择表,当我选择一行时,会发生此异常:

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

这是我的 Books 表:

<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

我将选定的行分配给selectedBook

错误是无法从object 类型转换为Book 类型。

selectedBook变量类型是Book,但是哪个变量是object导致这个错误?

【问题讨论】:

  • @Kukeltje 与此无关。
  • 如果你学习如何调试、分析堆栈跟踪等,你会发现它与 IS 100 相关
  • 你已经得到了这个异常并且你被告知了它。您为什么尝试使用类似数组的索引(例如 item[0])来引用此列表 - List&lt;Book&gt; booksList?异常消息表明Object[] 不能(类型)转换为Book[Ljava.lang.Object; 表示Object[].class - java.lang.Class 表示Objects 的数组类)。
  • @Tiny 因为我使用的是带有 jsf 的 hibernate,所以 hibernate 查询返回 list Of arrays

标签: hibernate jsf primefaces datatable


【解决方案1】:

你是泛型类型擦除的受害者。

您的List&lt;Book&gt; bookList实际上List&lt;Object[]&gt; 填充,而不是List&lt;Book&gt;。您的 JSF 页面中的 #{item[0]}#{item[1]} 等没有引发 EL 异常这一事实证实了这一点。您知道这一点是因为您之前的问题 https://stackoverflow.com/questions/29975635/java-lang-numberformatexception-for-input-string-while-iterating-over-a-pdatat 以及链接副本中的答案。

您需要修复您的 Hibernate 查询,使其返回真正的 List&lt;Book&gt;,而不是 List&lt;Object[]&gt;。例如,您需要在创建查询时执行SELECT b FROM Book b 而不是SELECT b.id, b.title FROM Book b 并将Book.class 设置为返回类。您应该不需要在(List&lt;Book&gt;) 上添加演员表。有点理智的 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&lt;Object[]&gt; bookListObject[] selectedBook 等。不用说这是一个糟糕的主意。

【讨论】:

  • 这是我见过的非常复杂的问题!
  • 只有当您对基本 Java 不熟悉时才可以。在您还没有熟练掌握基本 Java 的情况下,已经深入研究 Java EE 是不明智的。诚然,Java EE 看起来令人兴奋和具有挑战性,但我强烈建议暂停 Java EE,将 Java EE 项目搁置一旁,然后花几周的时间先学习一些基本的 Java。通过这种方式,您可以更好地掌握 Java 基础知识,例如在这种特定情况下的泛型和类型擦除。事实上,每次遇到 java.lang.* 包的异常时,您“只是”遇到了一个基本的 Java 语言问题。
  • 你说得对,但实际上我知道问题出在演员表上,但我不知道为什么以及如何解决它!然后我发布这个问题。
  • 因为在某些情况下我有一些更复杂的查询(例如将多个表连接在一起并从多个表返回),我无法返回list if unit class。所以我必须做你的第二个解决方案。对吗?
  • 您不必这样做。这是你的选择。我不会推荐它,因为它只会以丑陋的代码结束。如果您无法确定正确的 Hibernate 方式,只需向 Hibernate 人员提问(或通过一些基本的 Hibernate 教程学习)。
【解决方案2】:

如果您查看完整的堆栈跟踪,您很可能会发现错误出现在您的代码中。您可以并且应该自己轻松调查类转换异常

作为侧节点:

  • value="#{testBean.booksList}" 指的是您的 bean 中未显示在您发布的 bean 代码中的方法(但非常非常相关,因为该列表中的单个项目是所选内容)
  • 你知道p:dataTable works是怎么回事吗?我想不是。查看 PF 展示并检查它的所有差异功能并检查源代码并与您的比较
  • 您不仅应该学习一些基本的 jsf/jpa,还应该学习基本的开发人员技能

【讨论】:

  • booksList 没有显示在 bean 中?你在开玩笑吗?睁大你的眼睛。
  • getter 不存在,只有字段。据我们所知,您的吸气剂是错误的。学习发布 MCVE。
  • 不客气...而且我不介意对这样的答案投反对票(我什至期待它并希望它,因为我的回答应得的,所以这意味着 SO 在一定程度上有效延长)。 没有得到的是,通过发布部分代码,不进行基本调查,你会大大降低你实际获得帮助的机会。在以后的帖子中,您可能会被忽略。好机会...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2015-12-07
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多