我正在使用样本方法在Facelets中编写一个简单的自定义函数。问题是JSF 2应用程序无法找到该功能。错误消息是:
/test.xhtml @15,73 rendered="#{test:isGranted('ONE_ROLE')}" Function 'test:isGranted' not found.
我一直在检查和重新检查,但找不到问题。这里的任何评论都会非常感激,因为很明显我错过了一些东西(但似乎所涉及的步骤非常简单)。
您知道是否还有其他必需品?
提前致谢。
相关代码:
在 web.xml 中声明标记XML描述符
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/test.taglib.xml</param-value>
</context-param>
文件 test.taglib.xml :
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://www.test.com/security/tags</namespace>
<function>
<function-name>isGranted</function-name>
<function-class>com.test.security.taglibs.IsGranted</function-class>
<function-signature>boolean isGranted(java.lang.String role)</function-signature>
</function>
</facelet-taglib>
标签类:
public class IsGranted extends TagHandler {
public static boolean isGranted(String role) {
// Do nothing. Just a test.
return false;
}
}
测试文件:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:test="http://www.test.com/security/tags">
<body>
<h:outputText value="You should NOT see this." rendered="#{test:isGranted('ONE_ROLE')}"/>
</body>
</html>
答案 0 :(得分:4)
在您的示例中,您声明了sec
命名空间前缀,但在函数调用中使用了test
前缀。但也许这只是一个复制错误。
另一个可能的原因是taglib文件的标题,它使用facelets 1.0 DTD而不是JSF 2.0版本。这可能会有问题,具体取决于您的JSF实现,例如,对于MyFaces,请参阅this bug report和discussion thread。 JSF 2.0标记库的标题是:
<facelet-taglib version="2.0"
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-facelettaglibrary_2_0.xsd">