@PostConstruct 如果 ManagedBean 在 jar 库中,则没有被 JSF 调用



我运行时遇到以下问题。

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

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

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

有人面对过这种情况吗?

我的环境:Glassfish 3.1.1(构建12(JSF 2.1.3

提前谢谢。

@PostConstruct注释尚未扫描。这是导致您的@ManagedBean注释和点赞未被扫描的相同问题的结果。

这个问题有几个原因:

  1. 您在Jetty/Tomcat/Joss AS上使用了Mojarra 2.1.0。这是注释扫描程序中一个非常特殊的错误。见1937年版。

  2. 您的/WEB-INF/faces-config.xml文件具有metadata-complete="true"属性。这与JSF 2.0规范中概述的第一个需求相冲突:

    11.5.1注释类扫描要求

    • 如果WEB-INF/faces-config.xml文件中的<faces-config>元素包含值为“true”metadata-complete属性,则实现不得对除实现本身提供的类之外的任何类执行注释扫描。否则,按以下步骤继续。

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

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

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

  3. 您的JAR文件并没有被丢弃在/WEB-INF/lib中,而是被丢弃在类路径中的其他地方。这与上述第4项要求相冲突。

  4. 您的Web应用程序的/WEB-INF/faces-config.xml和/或JAR的/META-INF/faces-config.xml与JSF 2.x不兼容。它不能包含特定于JSF 1.x的<faces-config>声明,而是特定于JSF 2.x的声明。

    <?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>
    

    JAR的/META-INF中的一个被允许完全为空。

原因1在您的特殊情况下可能会被刮伤,因为您在Glassfish上使用Mojarra 2.1.3。我敢打赌这是其他原因。

还要注意,构造后方法不能声明为抛出任何已检查的异常。来自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.

最新更新