如果ManagedBean在jar库中,则@FostConstruct不会被JSF调用

时间:2011-08-29 18:21:07

标签: jsf managed-bean postconstruct

我遇到了以下问题。

我有几个Managed Beans,目前在两个JSF应用程序之间共享。由于我不想将代码复制并粘贴到两者中(未来会更多),我将这个共享的托管bean放在JAR库中。我已关注此博客:http://jsflive.wordpress.com/2011/03/24/custom-component-library/

好吧,即使我把faces-config.xml放在JAR / META-INF / @ManagedBean中,@ ViewScoped也不起作用。我无法理解为什么,但如果我在faces-config.xml(JAR,而不是WAR)中注册bean,这个问题就会消失。

我可以忍受这个,但令我惊讶的是,没有为JAR库中的这个托管bean调用@PostConstruct注释。我没有收到任何错误,警告或其他。我认为bean正在加载,但是他们的注释没有被处理。

有人面对这个吗?

我的环境: Glassfish 3.1.1(build 12) JSF 2.1.3

提前致谢。

2 个答案:

答案 0 :(得分:15)

然后未扫描@PostConstruct注释。这是导致您的@ManagedBean注释和喜欢未被扫描的同一问题的结果。

导致此问题的原因有多种:

  1. 您在Jetty / Tomcat / JBoss AS上使用了Mojarra 2.1.0。这是注释扫描程序中的一个非常具体的错误。请参阅issue 1937

  2. 您的/WEB-INF/faces-config.xml文件具有metadata-complete="true"属性。这与JSF 2.0 specification中列出的第一项要求相冲突:

      

    11.5.1扫描注释类的要求

         
        
    • 如果<faces-config>文件中的WEB-INF/faces-config.xml元素包含值为metadata-complete的{​​{1}}属性,则实现不得对任何类执行注释扫描,除了实现本身提供的那些类。否则,请继续如下。

    •   
    • 如果运行时发现应用程序配置资源中的条目与注释之间存在冲突,则为   应用程序配置资源中的条目优先。

    •   
    • 必须扫描“true”中的所有课程。

    •   
    • 对于应用程序的WEB-INF/classes目录中的每个jar,如果jar包含WEB-INF/lib   文件或与正则表达式“META-INF/faces-config.xml”匹配的文件(即使是空文件),必须扫描该jar中的所有类。

    •   
  3. 您的JAR文件未在“.*\.faces-config.xml”中删除,但在类路径中的其他位置。这违反了上述第四项要求。

  4. 您的网络应用/WEB-INF/lib和/或您的JAR /WEB-INF/faces-config.xml不兼容JSF 2.x.它不能包含JSF 1.x特定的/META-INF/faces-config.xml声明,而是JSF 2.x特定声明。

    <faces-config>

    JAR <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> </faces-config> 中的那个被允许完全为空。

  5. 因为您在Glassfish上使用Mojarra 2.1.3,因此在您的特定情况下可能会划伤1。我敢打赌这是其他原因。

答案 1 :(得分:8)

另请注意,不得声明post-construct方法抛出任何已检查的异常。来自stderr的消息:

Method 'public void my.app.MyBean.postConstruct() throws java.lang.Exception' marked with the 'javax.annotation.PostConstruct' annotation cannot declare any checked exceptions. This method will be ignored.