如果@PostConstruct失败,将创建Bean

时间:2017-08-03 04:22:47

标签: jsf dependency-injection postconstruct

我一直在尝试解决我的managedBean有时为null的问题(我得到目标无法访问的错误消息,说明bean为空),如果我修改@PostConstruct方法,通常会发生这种间歇性问题。

启动应用程序时我真的没有看到任何错误,但是一旦我尝试通过XHTML与bean进行交互,BOOM! Bean为空。我阅读了@PostConstruct文档,它说如果发生异常,“bean没有投入使用”这是否意味着JSF不会创建/处理bean。失败的@postConstruct是否可以成为我的null bean的原因(基于我所提到的)?如果说@PostConstruct由于某种原因失败了,为什么我没有在服务器日志中看到异常(它是否应该优雅地失败)?

对不起,这是理论上的,但它是唯一对我有意义的东西,显示代码确实无济于事,因为根本原因很难。

另一个问题 - 如何捕获/调试@PostConstruct中的任何问题?

感谢您的时间,抱歉,如果我没有遵循一些Q& A Stackoverflow指南。

2 个答案:

答案 0 :(得分:3)

如果你有JSF @ManagedBean,默认情况下bean的实例化是懒惰的。这意味着只有在请求到来时才会创建bean。这就是为什么在启动应用程序时没有看到错误的原因。 managedBean注释具有名为eager的属性,您可以将其设置为true,但是当应用程序仅针对applicationScope bean启动时它将起作用,如@PostConstruct中所述3}}

创建生命周期通常遵循以下步骤:bean创建 调用默认构造函数 - >连接所有需要的托管属性和 环境 - >调用postConstruct方法 - >如果所有这些都是 当bean准备好提供请求时,这是成功的。

通常,管理bean的所有容器都会告诉其中一个步骤无法正常工作时发生的问题。为了进行调试,您可以尝试捕获development方法中的任何异常。另一个选择是在JSF应用程序上启用web.xml阶段,这可以通过在facesServlet <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> 文件中设置属性来完成,如下所示:

.ion-drag

如果出现错误,这将为您提供更多调试信息。您应该阅读您的JSF提供程序文档,了解在获取错误时提供的信息,因为它可能会有所不同,或者参考JSF规范本身。

但是,只要你在日志中没有得到任何结果,我就会假设配置中存在一些错误,或者页面本身也存在错误。为了确定您应该提供有关您确切问题的更多信息。

答案 1 :(得分:0)

任何未通过@PostConstruct调用的bean都不会被注入到客户端bean中 - 导致您的NPE。

即。如果@PostConstruct失败,则创建bean。

鉴于此,由于某个日志文件失败会出现异常 - 但这取决于服务器。例如,在Tomcat中,它可能会出现在logs/localhost.YYYY-MM-DD.log中(而不是许多人看到的catalina.out)。