如果 @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中很多人看的地方)。