【问题标题】:getApplication().evaluateExpressionGet trying to create new Instance (jsf 2.0 -> 2.2 migration issue?)getApplication().evaluateExpressionGet 尝试创建新实例(jsf 2.0 -> 2.2 迁移问题?)
【发布时间】:2014-10-26 00:40:12
【问题描述】:

出于某种原因(想知道为什么......)在创建我的 bean 之后(作为 ValueExpressionImpl 的结果:#{admin.userLocale}(我在构造函数断点的堆栈跟踪中看到它),紧之后,当我的相位监听器调用以下命令失败(异常)时

return context.getApplication().evaluateExpressionGet(context,
            "#{myBean}", myBean.class);

上面代码的执行第二次触发了构造函数——为什么?

奇怪的是,在许多其他应用程序中,我的确切机制工作得很好(bean 构造函数调用 -> 阶段侦听器调用“the”命令(它不再调用 bean 构造函数))......但在那个特定的应用程序中它不工作。

另外需要注意的是,在 MyFaces 2.0.11 中,此应用运行良好

我仔细检查了 faces-config / web.xml 是否与其他应用程序一样

我从 MyFaces JSF 2.0.11 迁移到 2.2.3 后遇到的例外情况是:

javax.faces.view.facelets.TagAttributeException: /viewMetadata/myPage.xhtml 在第 13 行和第 38 列 locale="#{myBean.userLocale}" null

...

原因:java.lang.NullPointerException 在 org.apache.myfaces.config.ManagedBeanBuilder.getScope(ManagedBeanBuilder.java:560)

我用谷歌搜索了一下,发现了以下MYFACES-3907,我什至尝试应用修复,但它所做的只是删除了异常,但我的 webapp 仍然不好

p.s 它是@SessionScoped,调用getApplication().evaluateExpressionGet 的阶段ID 是RESTORE_VIEW

关于如何找出导致问题的原因的任何想法?

谢谢!

【问题讨论】:

  • 您没有指定给定 bean 的范围,也没有指定您在生命周期的哪个阶段调用该方法...
  • 它是@SessionScoped,阶段ID是RESTORE_VIEW
  • 您是否也迁移到不同的 CDI 环境? CDI 在创建代理时调用构造函数。你最好在@PostConstruct 做生意。要确定负责调用构造函数的人,请放置一个断点并探索堆栈或在构造函数中执行Thread.dumpStack()
  • @BalusC,感谢您的提示,将继续使用 breakpoint ,我不在构造函数中做生意,我创建它只是为了记录和 breakpoint 从一开始的事情... jsf 中调用第一个 Bean 实例的代码是 #{myBean.userLocale} ,从我的 PhaseListener 中调用 getApplication().evaluateExpressionGet (在我所有的网络应用程序中都是相同的流程)
  • @BalusC,我用更清晰和详细的流程更新了问题/标题

标签: jsf-2 jsf-2.2 myfaces


【解决方案1】:

找到了问题...虽然我真的不知道为什么(确实有一些理论)

在我的那个豆子里有一个ManagedProperty...

@ManagedProperty(value = "#{error}")
private ErrorPageMBean error;  //with getter/setter

该托管财产存在多年,甚至没有使用过。再次在 MyFaces 2.0.11 中一切正常...

从我移除它的那一刻起,一切都开始正常工作了......

知道ManagedProperty 有什么问题吗?

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 2019-10-16
    • 2014-04-28
    • 2015-10-17
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多