繁体   English   中英

javax.el.E​​LException: 在 com.example.Bean 类型上读取“foo”时出错

[英]javax.el.ELException: Error reading 'foo' on type com.example.Bean

我正在阅读以下教程

h:dataTable/@value 中使用的表达式通常指定定义了 getter 的属性名称,这意味着在控制器 BookController 类中定义了一个属性 books(可选)以及一个名为 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 方法?

你的问题和书上说的不一样。 如果 JSF/EL 找不到完整的 getter 方法,您将得到以下异常:

javax.el.PropertyNotFoundException:在类型 pl.ctrl.BookController 上找不到属性“books”

或者,如果它找不到完整的 bean 本身:

javax.el.PropertyNotFoundException:目标无法访问,标识符“bookController”解析为空

但是你得到了:

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 方法必须只返回已经准备好的属性。 另请参阅为什么 JSF 多次调用 getter以及我应该如何以及何时从 h:dataTable 的数据库加载模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM