如果 ManagedBean 位于 jar 库内,则 @PostConstruct 不会被 JSF 调用
我正在运行,遇到以下问题。
目前,我有一些在两个 JSF 应用程序之间共享的托管 Bean。因为我不想复制并粘贴这两个中的代码(将来会更多),所以我已将此共享托管 bean 放入 JAR 库中。我关注了这个博客: http://jsflive.wordpress.com /2011/03/24/custom-component-library/
好吧,即使我将 faces-config.xml 放在 JAR/META-INF/ 中 @ManagedBean 和 @ViewScoped没用。我不明白为什么,但如果我在 faces-config.xml 中注册 beans(JAR 的,而不是 WAR 的),这个问题就会消失。
我可以接受这一点,但令我惊讶的是,JAR 库中的托管 bean 并未调用 @PostConstruct 注释。我没有收到任何错误、警告或其他信息。我认为 bean 已被加载,但它们的注释尚未被处理。
有人遇到过这个吗?
我的环境: Glassfish 3.1.1(版本 12) JSF 2.1.3
提前致谢。
I'm running with the following problem.
I have a few Managed Beans that are shared between, at this moment, two JSF applications. As I don't want to copy and paste the code in the two (more in the coming future) I've put this shared managed beans inside a JAR library. I've followed this blog: http://jsflive.wordpress.com/2011/03/24/custom-component-library/
Well, even if I put the faces-config.xml inside JAR/META-INF/ the @ManagedBean and @ViewScoped didn't work. I couldn't realise why, but if I register the beans in faces-config.xml (JAR ones, not WAR ones) this problem goes away.
I could live with this, but for my surprise the @PostConstruct annotation didn't get called for this managed beans inside JAR library. I don't get any error, warning or else. I suppose that the beans are getting loaded, but the their annotations aren't being processed.
Have anyone faced this?
My environment:
Glassfish 3.1.1 (build 12)
JSF 2.1.3
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
那么
@PostConstruct
注解还没有被扫描到。这是导致您的@ManagedBean
注释和赞未被扫描的同一问题的结果。导致此问题的原因有多种:
您在 Jetty/Tomcat/JBoss AS 上使用了 Mojarra 2.1.0。这是注释扫描器中一个非常具体的错误。请参阅 issue 1937。
您的
/WEB-INF/faces-config.xml
文件具有metadata-complete="true"
属性。这与 JSF 2.0 规范 中概述的第一个要求相冲突:<块引用>
11.5.1 扫描类注释的要求
如果
WEB-INF/faces-config.xml
文件中的
元素包含metadata-complete 属性,其值为
“true”
,则实现不得对除实现本身提供的类之外的任何类执行注释扫描。否则,请继续如下。如果运行时发现应用程序配置资源中的条目与注释之间存在冲突,
应用程序配置资源中的条目优先。
必须扫描
WEB-INF/classes
中的所有类。对于应用程序
WEB-INF/lib
目录中的每个 jar,如果该 jar 包含“META-INF/faces-config.xml”
文件或与正则表达式“.*\.faces-config.xml”匹配的文件(即使是空文件),必须扫描该 jar 中的所有类。
您的 JAR 文件并未放置在
/WEB-INF/lib
中,而是放置在类路径中的其他位置。这与上面概述的第四个要求相冲突。您的 web 应用程序的
/WEB-INF/faces-config.xml
和/或 JAR 的/META-INF/faces-config.xml
不是 JSF 2.x兼容的。它不得包含 JSF 1.x 特定的
声明,而是包含 JSF 2.x 特定的声明。JAR 的
/META-INF
中的内容允许完全为空。当您在 Glassfish 上使用 Mojarra 2.1.3 时,在您的特定情况下,原因 1 可能会被划伤。我敢打赌这是其他原因。
Then the
@PostConstruct
annotation has not been scanned. This is result of the same problem which caused that your@ManagedBean
annotation and likes have not been scanned.There are several causes of this problem:
You used Mojarra 2.1.0 on Jetty/Tomcat/JBoss AS. This is a very specific bug in the annotation scanner. See issue 1937.
Your
/WEB-INF/faces-config.xml
file has ametadata-complete="true"
attribute. This conflicts the 1st requirement as outlined in JSF 2.0 specification:Your JAR file is not been dropped in
/WEB-INF/lib
, but somewhere else in the classpath. This conflicts the 4th requirement as outlined above.Your webapp's
/WEB-INF/faces-config.xml
and/or your JAR's/META-INF/faces-config.xml
is not JSF 2.x compatible. It must not contain a JSF 1.x specific<faces-config>
declaration, but a JSF 2.x specific one.The one in JAR's
/META-INF
is allowed to be completely empty.Cause 1 can be scratched in your particular case as you're using Mojarra 2.1.3 on Glassfish. I'll bet it to be the other causes.
另请注意,构造后方法不得声明为引发任何已检查异常。来自
stderr
的消息:Also note that post-construct method must not be declared to throw any checked exception. Message from
stderr
: