如果 @PostConstruct 失败,将创建 Bean
Will Bean get created if @PostConstruct fails
我一直在尝试解决我的 managedBean 有时为 null 的问题(我收到目标无法访问的错误消息,指出该 bean 为 null),如果我修改 @PostConstruct 方法,通常会出现此间歇性问题。
启动应用程序时我确实没有看到任何错误,但是当我尝试通过 XHTML 与 bean 交互时,BOOM! Bean 为空。我通读了@PostConstruct 文档,它说如果应该发生异常,"the bean is not put into service" 这是否意味着 JSF 不会 create/handle bean。失败的@postConstruct 会是我的 null bean 的原因吗(根据我提到的内容)?如果说 @PostConstruct 由于某种原因失败了,为什么我没有在服务器日志中看到异常(它应该优雅地失败)?
抱歉,这是理论上的,但这是唯一对我有意义的事情,显示代码真的无济于事,因为它很难找到根本原因。
另一个问题 - 我如何 catch/debug @PostConstruct 中的任何问题?
感谢您抽出时间,如果我没有遵循一些问答 Whosebug 指南,抱歉。
如果你有 JSF @ManagedBean
,bean 的实例化默认是惰性的。这意味着只有在请求到来时才会创建 bean。这就是您在启动应用程序时看不到错误的原因。 managedBean
注释有 属性 命名为 eager
,您可以将其设置为 true
,但是当应用程序仅针对 applicationScope
beans 启动时它将起作用,正如它所说在 documentation.
创建生命周期通常遵循以下步骤:bean creation by
调用默认构造函数 -> 连接所有需要的托管属性和
环境 -> 调用 @PostConstruct
方法 -> 如果所有这些都是
当 bean 准备好为请求服务时成功。
通常,所有管理 bean 的容器都会报告其中一个步骤未正常运行时发生的问题。为了进行调试,您可以尝试捕获 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 规范本身。
但就您在日志中没有得到任何信息而言,我假设配置或页面本身存在一些错误。为了确定您应该提供有关您确切问题的更多信息。
任何 @PostConstruct
调用失败的 bean 将永远不会被注入客户端 bean - 导致您的 NPE。
即如果 @PostConstruct
失败,则 不会 创建 bean。
鉴于此,由于某处日志文件中的故障,将会出现异常 - 但这取决于服务器。例如在Tomcat中它可能出现在logs/localhost.YYYY-MM-DD.log
中(而不是catalina.out
中很多人看的地方)。
我一直在尝试解决我的 managedBean 有时为 null 的问题(我收到目标无法访问的错误消息,指出该 bean 为 null),如果我修改 @PostConstruct 方法,通常会出现此间歇性问题。
启动应用程序时我确实没有看到任何错误,但是当我尝试通过 XHTML 与 bean 交互时,BOOM! Bean 为空。我通读了@PostConstruct 文档,它说如果应该发生异常,"the bean is not put into service" 这是否意味着 JSF 不会 create/handle bean。失败的@postConstruct 会是我的 null bean 的原因吗(根据我提到的内容)?如果说 @PostConstruct 由于某种原因失败了,为什么我没有在服务器日志中看到异常(它应该优雅地失败)?
抱歉,这是理论上的,但这是唯一对我有意义的事情,显示代码真的无济于事,因为它很难找到根本原因。
另一个问题 - 我如何 catch/debug @PostConstruct 中的任何问题?
感谢您抽出时间,如果我没有遵循一些问答 Whosebug 指南,抱歉。
如果你有 JSF @ManagedBean
,bean 的实例化默认是惰性的。这意味着只有在请求到来时才会创建 bean。这就是您在启动应用程序时看不到错误的原因。 managedBean
注释有 属性 命名为 eager
,您可以将其设置为 true
,但是当应用程序仅针对 applicationScope
beans 启动时它将起作用,正如它所说在 documentation.
创建生命周期通常遵循以下步骤:bean creation by
调用默认构造函数 -> 连接所有需要的托管属性和
环境 -> 调用 @PostConstruct
方法 -> 如果所有这些都是
当 bean 准备好为请求服务时成功。
通常,所有管理 bean 的容器都会报告其中一个步骤未正常运行时发生的问题。为了进行调试,您可以尝试捕获 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 规范本身。
但就您在日志中没有得到任何信息而言,我假设配置或页面本身存在一些错误。为了确定您应该提供有关您确切问题的更多信息。
任何 @PostConstruct
调用失败的 bean 将永远不会被注入客户端 bean - 导致您的 NPE。
即如果 @PostConstruct
失败,则 不会 创建 bean。
鉴于此,由于某处日志文件中的故障,将会出现异常 - 但这取决于服务器。例如在Tomcat中它可能出现在logs/localhost.YYYY-MM-DD.log
中(而不是catalina.out
中很多人看的地方)。