我一直在尝试解决我的 ManagedBean 有时为空的问题(我收到目标无法访问的错误消息,指出该 bean 为空),并且如果我修补 @PostConstruct 方法,通常会出现此间歇性问题。
启动应用程序时,我确实没有看到任何错误,但是当我尝试通过 XHTML 与 bean 交互时,BOOM! Bean 为空。我通读了 @PostConstruct 文档,它说如果发生异常,“bean 未投入使用”是否意味着 JSF 不会创建/处理该 bean。失败的 @postConstruct 是否会成为我的 null bean 的原因(基于我所提到的)?如果说 @PostConstruct 由于某种原因失败,为什么我在服务器日志中没有看到异常(它应该优雅地失败)?
抱歉,这是理论上的,但这是对我来说唯一有意义的事情,并且显示代码确实没有帮助,因为很难找到根本原因。
另一个问题 - 如何捕获/调试 @PostConstruct 中的任何问题?
感谢您抽出宝贵的时间,如果我没有遵循 Stackoverflow 的一些问答指南,我们深表歉意。
最佳答案
如果您有 JSF @ManagedBean
,则默认情况下 bean 的实例化是惰性的。这意味着只有当请求到来时才会创建 bean。这就是您在启动应用程序时看不到错误的原因。 managementBean
注释具有名为 eager
的属性,您可以将其设置为 true
,但当应用程序启动时仅适用于 applicationScope
beans,如 documentation 中所述.
创建生命周期通常遵循以下步骤:bean 创建
调用默认构造函数 -> 连接所有需要的托管属性并
环境 -> 调用 @PostConstruct
方法 -> 如果所有这些都满足
成功时,bean 已准备好为请求提供服务。
通常,当其中一个步骤无法正常工作时,所有管理 bean 的容器都会报告出现的问题。为了进行调试,您可以 try catch postConstruct
方法中的任何异常。另一种选择是在 JSF 应用程序上启用 development
阶段,这是通过在 web.xml
文件中为 facesServlet
设置属性来完成的,如下所示:
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
如果出现错误,这将为您提供更多调试信息。您应该阅读 JSF 提供程序文档,了解在收到错误时提供的信息,因为它可能会有所不同,或者咨询 JSF 规范本身。
但就您在日志中没有收到任何内容而言,我认为配置或页面本身存在一些错误。为了确定您应该提供有关您的确切问题的更多信息。
关于jsf - 如果 @PostConstruct 失败,Bean 会被创建吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45474771/