【问题标题】:Cannot find annotated custom JSF2 component in jar在 jar 中找不到带注释的自定义 JSF2 组件
【发布时间】:2026-01-24 16:10:01
【问题描述】:

我们正在将 JSF1.2 迁移到 JSF2 应用程序,我遇到了自定义组件的问题。我们有一个带有组件的单独 jar,在那个 jar 中我有这个:

@FacesComponent(value = "Panel2")
public class Panel2 extends UIOutput { ... }

在 META-INF 下的 taglib 中,我有这个:

<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    id="mw">
    <namespace>http://www.ssss.be/jsf/mw</namespace>
    <composite-library-name>mw</composite-library-name>
    <tag>
        <tag-name>panel2</tag-name>
        <component>
            <component-type>Panel2</component-type>
        </component>
    </tag>
</facelet-taglib>

制作完这一切的jar并在我的其他项目中使用后,我使用标签如下:

xmlns:mw="http://www.ssss.be/jsf/mw"

然后:

<mw:panel2 />

但结果很不幸:

javax.faces.FacesException: Expression Error: Named Object: Panel2 not found. at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1858)
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1129)

我在这里做错了什么?

【问题讨论】:

    标签: java jsf jsf-2 custom-component


    【解决方案1】:
    • 确保 faces-config.xml 中的 JSF 版本至少为版本 2
    • 确保 faces-config.xml 中没有将 metadata-complete 属性设置为 true。
    • 确保类在WEB-INF/classes;或者,如果在 WEB-INF/lib 的 jar 中,该 jar 包含 faces-config.xml(否则该规范不需要注释扫描)
    • 确保在 XML 配置文件中没有定义 Panel2 组件类型(此列表优先)

    JSF 2 spec;第 11.5.1 节。

    【讨论】:

    • 谢谢!我只是忘记升级我的 componentlib jar 中的 faces-config。
    • 我有一个similar problem。这篇文章对我帮助很大。谢谢。