jsf - 如果 @PostConstruct 失败,Bean 会被创建吗

标签 jsf dependency-injection postconstruct

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

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

抱歉,这是理论上的,但这是对我来说唯一有意义的事情,并且显示代码确实没有帮助,因为很难找到根本原因。

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

感谢您抽出宝贵的时间,如果我没有遵循 Stackoverflow 的一些问答指南,我们深表歉意。

最佳答案

如果您有 JSF @ManagedBean,则默认情况下 bean 的实例化是惰性的。这意味着只有当请求到来时才会创建 bean。这就是您在启动应用程序时看不到错误的原因。 managementBean 注释具有名为 eager 的属性,您可以将其设置为 true,但当应用程序启动时仅适用于 applicationScope beans,如 documentation 中所述.

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

通常,当其中一个步骤无法正常工作时,所有管理 bean 的容器都会报告出现的问题。为了进行调试,您可以 try catch 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 规范本身。

但就您在日志中没有收到任何内容而言,我认为配置或页面本身存在一些错误。为了确定您应该提供有关您的确切问题的更多信息。

关于jsf - 如果 @PostConstruct 失败,Bean 会被创建吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45474771/

相关文章:

jsf - 如何让JSF render 严格符合XHTML 1.0?

jsf - 在打开 Primefaces 对话框之前设置 bean 属性

jsf - 命名空间为 http ://xmlns. jcp.org/jsf/html 的元素可能没有命名空间 http ://xmlns. jcp.org/jsf 中的属性

.net - Autofac + SignalR

java - 如何使用 Spring 测试具有 @PostConstruct 方法的类的构造函数?

unit-testing - Grails单元测试在@PostConstruct上失败

jsf - PrimeFaces 3.3 <p :datatable> filtering fails with UTF8

c# - 加载 Ninject 模块后设置所有绑定(bind)的范围

javascript - 由于找不到模块而将模块注入(inject) Angular

java - Spring Autowiring 对象在postcontruct方法中为空