【发布时间】: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,我用更清晰和详细的流程更新了问题/标题