Facelet标记库机制无法按预期工作

时间:2012-01-26 11:30:27

标签: jsf-2 glassfish-3

我无法在war文件中打包taglibrary。我将标签从项目移动到当前项目依赖的额外库。我将taglibrary文件放入包含标签的jar的META-INF目录中(如何描述here)。但页面不起作用:

Expression Error: Named Object: eu.barbucha.barbatag.simple.PropertyTag not found.

服务器能够找到taglibrary。否则页面有效,只显示一个警告:

Warning: This page calls for XML namespace http://barbucha.eu/tags declared with prefix br but no taglibrary exists for that namespace.

因此问题是:为什么服务器只找到描述符,而不是类?当我将类从WEB-INF/lib/barbatag.jar复制到WEB-INF/classes并在管理控制台中重新启动webapp时,该页面正常工作。只有当UI组件直接涉及应用程序的类时,服务器才会找到它们,而不是存储在WEB-INF/lib目录中的jar中。另一方面,服务器从jar加载taglib描述符。这真的令人困惑......关键阶级宣言:

package eu.barbucha.barbatag.simple;    

@FacesComponent("eu.barbucha.barbatag.simple.PropertyTag")
public class PropertyTag extends UIComponentBase { ... }

关键标签的定义:

<tag>
    <display-name>The component taking values from a property file</display-name>
    <tag-name>property</tag-name>
    <component>
        <component-type>eu.barbucha.barbatag.simple.PropertyTag</component-type>
    </component>
</tag>

一个有用的重点:我正在使用Spring MVC。

1 个答案:

答案 0 :(得分:3)

您需要在JAR中提供/META-INF/faces-config.xml文件,以便让JSF扫描JAR文件以查找具有JSF特定注释的类,如@FacesComponent。这样做是为了防止JSF不必要地扫描每个JAR文件的类(如果你有很多的话,这可能是非常耗费时间和CPU消耗的。)