【问题标题】:javax.el.ELException: Error reading 'foo' on type com.example.Beanjavax.el.E​​LException:在类型 com.example.Bean 上读取“foo”时出错
【发布时间】:2023-03-25 02:17:02
【问题描述】:

我正在阅读the following tutorial

h:dataTable/@value 中使用的表达式通常指定一个属性 为其定义了 getter 的名称,这意味着在控制器中 BookController 类定义了一个属性书籍(可选)以及一个 名为 getBooks 的方法(这是强制性的)。在这种特殊情况下,它是 只需定义 getBooks 方法,因为不需要 控制器类中的books属性

我一直在尝试在我的 eclipse 和 tomcat 7 中实现这样的想法。但它一直困扰着我:

javax.el.E​​LException: /views/books/listAll.xhtml @9,60 value="#{bookController.books}": 读取 pl.ctrl.BookController 类型的“书籍”时出错

我的问题是,有没有可能:

<h:dataTable value="#{bookController.books}" var="b">

虽然#{bookController} 托管 bean 中没有 books 属性,而只有 getBooks() getter 方法?

【问题讨论】:

  • 那么,您的代码在哪里?顺便说一句,如果您定义一个公共 getBooks() 方法,您实际上定义了一个 books 属性。您不一定要定义的是books 字段。字段和属性不是一回事。

标签: jsf properties el getter


【解决方案1】:

您的问题与书中所说的不同。如果 JSF/EL 找不到完整的 getter 方法,您将得到以下异常:

javax.el.PropertyNotFoundException: Property 'books' not found on type pl.ctrl.BookController

或者如果它找不到整个 bean 本身:

javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bookController' resolved to null

但是你得到了:

javax.el.E​​LException: 读取 pl.ctrl.BookController 类型的“书籍”时出错

这意味着找到了bean和getter方法,但是调用getter方法抛出了异常。基本上,在 JSF/EL 的掩护下发生了以下情况:

try {
    Object result = bookController.getBooks();
} catch (Exception e) {
    throw new ELException("Error reading 'books' on type pl.ctrl.BookController", e);
}

注意e 被传递为ELException 的原因。因此,原始异常必须在您未在问题中任何位置发布的堆栈跟踪中进一步显示为“由以下原因引起”。最底层是所有问题的根本原因,是您具体问题的答案。如果您无法解释,只需将异常类型和消息复制粘贴到合适的搜索引擎中即可找到答案和线索。


与具体问题无关,从 getter 方法抛出的异常反过来表明代码有问题。 getter 方法不应该执行任何对异常敏感的业务逻辑。也就是说,它可以在每个 bean 的生命周期内被多次调用,并且在整个 bean 的生命周期内一遍又一遍地重复相同的业务逻辑显然是低效的。停止这样做并将业务逻辑移动到一次性初始化或操作/事件侦听器方法。 getter 方法必须只返回已经准备好的属性。另见Why JSF calls getters multiple timesHow and when should I load the model from database for h:dataTable

【讨论】:

  • 如果 getter 是 e.g.受保护?还是私人的?很好奇错误然后......我会稍后再试(或者是原因,你希望 OP 找出 ;-))
  • @Kukeltje:就PropertyNotFoundException。这已经是技术要求了。
  • @BalusC:你是对的。 原因:javax.el.PropertyNotFoundException:在类型 pl.ctrl.BookController 上找不到属性“books” getter 有参数,它看起来像:public List&lt;Book&gt; getBooks(EntityManager em) { return Book.getAllObjects(em); 和实体类中的相关方法是:@SuppressWarnings( "unchecked") public static List&lt;Book&gt; getAllObjects( EntityManager em) { Query query = em.createQuery( "SELECT b FROM Book b", Book.class); List&lt;Book&gt; books = query.getResultList(); return books; } 任何帮助!!。
  • 这对你来说确实是错误的。单击答案底部的最后一个链接以获取正确的业务逻辑方式(以及该答案底部的链接以获取更多详细信息等)。
猜你喜欢
  • 2016-06-10
  • 2011-12-18
  • 1970-01-01
  • 2015-12-07
  • 2017-09-01
相关资源
最近更新 更多