Пользовательская функция Facelets не найдена - PullRequest
1 голос
/ 19 декабря 2011

Я пишу простую пользовательскую функцию в 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>

1 Ответ

4 голосов
/ 19 декабря 2011

В вашем примере вы объявляете префикс пространства имен sec, но используете префикс test в вызове функции. Но, возможно, это была просто ошибка копирования.

Другой возможной причиной может быть заголовок файла taglib, в котором вместо версии JSF 2.0 используется DTD facelets 1.0. Это может быть проблематично в зависимости от вашей реализации JSF, например, для MyFaces см. этот отчет об ошибке и ветку обсуждения . Заголовок для теговой библиотеки 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">
...