@施工后没有';如果ManagedBean在jar库中,则JSF不会调用它

@施工后没有';如果ManagedBean在jar库中,则JSF不会调用它,jsf,managed-bean,postconstruct,Jsf,Managed Bean,Postconstruct,我正在运行以下问题 我有一些托管bean,目前在两个JSF应用程序之间共享。由于我不想在这两个库中复制和粘贴代码(将来还会有更多),我将这个共享托管bean放在一个JAR库中。我关注了这个博客: 好吧,即使我将faces-config.xml放在JAR/META-INF/ManagedBean和@ViewScoped中也不起作用。我不知道为什么,但是如果我在faces-config.xml中注册bean(JAR的,而不是WAR的),这个问题就会消失 我可以接受这一点,但出乎意料的是,@PostC

我正在运行以下问题

我有一些托管bean,目前在两个JSF应用程序之间共享。由于我不想在这两个库中复制和粘贴代码(将来还会有更多),我将这个共享托管bean放在一个JAR库中。我关注了这个博客:

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

我可以接受这一点,但出乎意料的是,@PostConstruct注释没有被调用用于JAR库中的托管bean。我没有收到任何错误、警告或其他信息。我假设bean正在加载,但是它们的注释没有被处理

有人面对过这个吗

我的环境: Glassfish 3.1.1(构建12) JSF2.1.3


提前感谢。

那么
@PostConstruct
注释尚未扫描。这是导致您的
@ManagedBean
注释和类似注释未被扫描的同一问题的结果

这个问题有几个原因:

  • 您在Jetty/Tomcat/JBoss AS上使用了Mojarra 2.1.0。这是注释扫描程序中一个非常特殊的错误。看

  • 您的
    /WEB-INF/faces config.xml
    文件具有
    metadata complete=“true”
    属性。这与下述第1条要求相冲突:

    11.5.1注释类扫描要求
    • 如果
      WEB-INF/faces config.xml
      文件中的
      元素包含值为
      “true”
      元数据完整属性,则实现不得对任何类执行注释扫描,但实现本身提供的类除外。否则,继续如下操作

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

    • 必须扫描
      WEB-INF/classes
      中的所有类

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

  • 您的JAR文件没有被放到
    /WEB-INF/lib
    中,而是放在类路径的其他地方。这与上述第四项要求相冲突

  • 您的webapp的
    /WEB-INF/faces config.xml
    和/或您的JAR的
    /META-INF/faces config.xml
    与JSF 2.x不兼容。它不能包含特定于JSF1.x的
    声明,而是特定于JSF2.x的声明

    
    
    JAR的
    /META-INF
    中的一个可以完全为空


  • 因为在玻璃鱼上使用Mojarra 2.1.3时,在您的特定情况下可能会划伤1。我敢打赌这是其他原因。

    还要注意,构造后方法不能声明为抛出任何选中的异常。来自标准的消息

    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.
    

    谢谢巴卢斯的回答。好吧,faces配置文件(JAR和WAR)指向JSF2.x,并且两者都没有使用完整的元数据,所以我迷路了。我想#1是个问题,因为我没有在WAR中打包JAR,但我将它作为库部署在了……domains/domain1/lib中。哦,我完全没有想到。你为什么把罐子放在那里?JSF2规范要求JAR必须位于
    /WEB-INF/lib
    中。我改进了答案,将其添加为第3点。对不起,我没有注意到这一点。我的错误。解释原因:只是因为我不想“复制”罐子。。。我也在使用Primefaces,我也把它放在domain/lib中。它是有效的,所以我是JSF领域的新手,我想我可以对我的库做同样的事情。PF库不包含任何托管bean,所有内容都在xml文件中注册。我会把罐子打包到你的网络应用程序中。