2017-08-03 294 views
2

我一直在试图解决一个问题,我的managedBean有时是空的(我得到了目标不可达错误消息,说bean是空的),这个间歇性问题通常发生在我修补程序在@PostConstruct方法中。如果@PostConstruct失败,Bean会被创建

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

对不起,这是理论性的,但它是唯一对我有意义的事情,并且显示代码真的不会帮助,因为根本原因很难。

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

感谢您的时间,对不起如果我没有按照一些Q & Stackoverflow准则。

+0

@IrfanBhindawala你应该仔细阅读我的答案,因为我提供了证明我的观点的文档链接。你检查出来了吗? –

+0

@TolegenIzbassar,我很抱歉从我身边的误解,因为我已经看到,问题中有标签'春',然后我通过第一个标签得到了错误的方向。对不起! –

+0

谢谢你们!我从来没有搞清楚这个,文件非常脆弱,有时甚至使用String .equals会导致一个空bean。谢谢你的时间! – Joe

回答

3

如果您有JSF @ManagedBean,则缺省情况下该bean的实例化是惰性的。这意味着只有当请求会来时才会创建bean。这就是为什么在启动应用程序时看不到错误。 managedBean注释具有名称为eager的属性,您可以将其设置为true,但它将在应用程序仅启动applicationScope beans时起作用,如在documentation中所述。

创作的生命周期通常遵循以下步骤: 调用默认的构造函数创建bean - >布线所需的所有管理特性和 环境 - >调用@PostConstruct方法 - >如果这一切是 全成那个时候的豆准备为请求提供服务。

通常情况下,所有管理bean的容器都告诉有一个步骤没有正常工作时发生的问题。为了调试,您可以尝试捕获postConstruct方法中的任何异常。另一种选择是让你development阶段JSF应用程序,它通过设置在web.xml文件属性为facesServlet这样做:

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 

这会给你在错误的情况下更多的调试信息。您应该阅读JSF提供商提供的有关获取错误信息的文档,因为它可能会有所不同,或者需要咨询JSF规范本身。

但是,只要你在日志中没有任何东西,我认为在配置中或者页面本身可能存在一些错误。为了确定你应该提供更多关于你确切问题的信息。

+0

“默认情况下,bean的实例化是懒惰的,这意味着只有在请求会出现时才会创建bean,这就是为什么在引导应用程序时看不到错误” - 这是错误的。默认情况下Spring bean的行为是singleton,容器在启动时实例化这个bean(默认行为)。有关更多信息,您可以[点击此处](http://docs.spring.io/spring/docs/current/spring-framework-reference/ htmlsingle /#beans-dependency-resolution) –

+0

@IrfanBhindawala我在说的不是spring beans,当然这在开始的时候会实例化。我正在谈论'JSF ManagedBeans'看提供的文档... –

+0

@IrfanBhindawala我编辑了答案,以澄清这一点。 –

0

调用失败的任何bean都不会被注入到客户端bean中 - 从而导致您的NPE。

即该豆是而不是如果@PostConstruct失败则创建。

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