【问题标题】:Will Bean get created if @PostConstruct fails如果@PostConstruct 失败,将创建 Bean
【发布时间】:2017-08-03 04:22:47
【问题描述】:

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

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

抱歉,这是理论上的,但它对我来说是唯一有意义的事情,并且显示代码真的无济于事,因为它很难找到根本原因。

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

感谢您抽出宝贵时间,如果我没有遵循 Stackoverflow 的一些问答指南,请见谅。

【问题讨论】:

  • @IrfanBhindawala 您应该仔细阅读我的回答,因为我提供了证明我观点的文档链接。你检查了吗?
  • @TolegenIzbassar,对于我的误解,我深表歉意,因为我看到问题中有标签“弹簧”,然后我的第一个标签方向错误。对不起!!!
  • 谢谢大家!我从来没有完全弄清楚这一点,该文件非常脆弱,有时,即使使用 String .equals 也会导致空 bean。感谢您的宝贵时间!

标签: jsf dependency-injection postconstruct


【解决方案1】:

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

创建生命周期通常遵循以下步骤: bean 创建由 调用默认构造函数 -> 连接所有需要的托管属性和 环境 -> 调用 @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 规范本身。

但就您在日志中一无所获而言,我认为配置或页面本身可能存在一些错误。为了确定您应该提供有关您确切问题的更多信息。

【讨论】:

  • " bean 的实例化默认是惰性的。这意味着只有在请求到来时才会创建 bean。这就是为什么您在启动应用程序时看不到错误"- 这是错误的。 Spring bean 的行为默认为单例,容器在启动时实例化此 bean(默认行为)。有关更多信息,您可以click here
  • @IrfanBhindawala 我说的不是spring bean,它当然在一开始就实例化。我说的是JSF ManagedBeans看提供的文档...
  • @IrfanBhindawala 我编辑了答案以澄清这一点。
【解决方案2】:

@PostConstruct 调用失败的任何 bean 将永远不会被注入到客户端 bean - 导致您的 NPE。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2017-03-09
    • 1970-01-01
    • 2013-02-07
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多