Facelets custom function not found

我只是一个虾纸丫 提交于 2019-12-11 06:17:36

问题


I'm writing a simple custom function in Facelets with a sample method. The problem is that the JSF 2 application fails to locate that function. The error message is:

/test.xhtml @15,73 rendered="#{test:isGranted('ONE_ROLE')}" Function 'test:isGranted' not found.

I've been checking and rechecking and can't find the problem. Any comment here would be really appreciated as it's clear that I'm missing something (but it seems that the steps involved are really simple).

Do you know if there are other requisites?

Thanks in advance.

The relevant code:

In the web.xml the tag XML descriptor is declared

<context-param>
        <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
        <param-value>/WEB-INF/test.taglib.xml</param-value>
</context-param> 

The file 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>

The tag class:

public class IsGranted extends TagHandler {
    public static boolean isGranted(String role) {
        // Do nothing. Just a test.
        return false;
    }
}

And the test file:

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

回答1:


In your example you are declaring the sec namespace prefix but use the test prefix in your function call. But maybe that was just a copying mistake.

Another possible cause would be the header of your taglib file, which uses the facelets 1.0 DTD instead of the JSF 2.0 version. This might be problematic depending on your JSF implementation, for example for MyFaces see this bug report and discussion thread. The header for a JSF 2.0 taglib would be:

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


来源:https://stackoverflow.com/questions/8559104/facelets-custom-function-not-found

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!