我一直在尝试解决我的managedBean有时为null的问题(我得到目标无法访问的错误消息,说明bean为空),如果我修改@PostConstruct方法,通常会发生这种间歇性问题。
启动应用程序时我真的没有看到任何错误,但是一旦我尝试通过XHTML与bean进行交互,BOOM! Bean为空。我阅读了@PostConstruct文档,它说如果发生异常,“bean没有投入使用”这是否意味着JSF不会创建/处理bean。失败的@postConstruct是否可以成为我的null bean的原因(基于我所提到的)?如果说@PostConstruct由于某种原因失败了,为什么我没有在服务器日志中看到异常(它是否应该优雅地失败)?
对不起,这是理论上的,但它是唯一对我有意义的东西,显示代码确实无济于事,因为根本原因很难。
另一个问题 - 如何捕获/调试@PostConstruct中的任何问题?
感谢您的时间,抱歉,如果我没有遵循一些Q& A Stackoverflow指南。
答案 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
)。