2015-02-02 2 views
1

Итак, у меня есть банка, содержащая несколько общих файлов .xhtml, которые я использую в своем веб-проекте (JSF2.2 на сервере Wildfly 8.1) в качестве пользовательских компонентов.Ссылка Функция EL из xhtml, расположенная в том же банке

Кроме того, в том же .jar У меня есть класс утилиты (ViewUtils), который имеет функцию, которую я вызываю из файлов .xhtml, расположенных в моем веб-проекте.

Дело в том, что я действительно хочу получить доступ к этой функции EL из файлов .xhtml, расположенных в той же банке, где находится функция, и я не могу. JBoss говорит, что выражение EL не распознается. Тем не менее, я могу вызвать эту функцию из файлов .xhtml, расположенных в моем веб-проекте (.war)

Я сам объясню? Вот код.

Это код в моем .jar

public final class ViewUtils { 

(...) 

public static String getEnumMessageKey(final Enum<?> e) { 

     String key = ""; 

     try { 
      key = "enum_" + e.getClass().getSimpleName().toLowerCase() + '_' + e.name().toLowerCase(); 
     } catch (Exception e) { 
      LOG.debug("Key not found or null."); 
     } 

     return key; 
    } 

(...) 

} 

custom.taglib.xml

<namespace>http://mycompany.com/taglib</namespace> 
<composite-library-name>conexiacomponent</composite-library-name> 

<function> 
    <function-name>enum_key</function-name> 
    <function-class>com.mycompany.one.webcore.util.ViewUtils</function-class> 
    <function-signature>java.lang.String getEnumMessageKey(java.lang.Enum)</function-signature> 
</function> 

.xhtml компонент

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" 
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:cx="http://mycompany.com/taglib"> 

(...) 

    <li>#{i18n[cx:enum_key(cc.attrs.enumParam)]}: #{cc.attrs.afiliado.numeroDocumento}</li> 

(...) 

</composite:implementation> 
</html> 

И это .xhtml находится в моем .war

<?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:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" 
    xmlns:cnx="http://mycompany.com/taglib" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 

    <composite:attribute name="valuePath"/> 
    <composite:attribute name="view"/> 

</composite:interface> 

<composite:implementation> 


    <h:selectOneMenu id="tipoDoc" value="#{cc.attrs.valuePath}" converter="com.mycompany.one.webcore.converter.GeneralConverter" styleClass="form-control input-sm" > 
     <f:selectItem itemLabel="Seleccione.." itemValue="#{null}" /> 
     <f:selectItems value="#{comboView.documentTypes}" var="_ti" itemLabel="#{i18n[cnx:enum_key(_ti)]}" itemValue="#{_ti}" /> 
    </h:selectOneMenu> 

</composite:implementation> 

</html> 

И, наконец, это ошибка, которую я получаю, когда пытаюсь получить доступ к представлению, включающему один из этих компонентов jar (вызывающий функцию).

Caused by: javax.el.ELException: Function 'cx:enum_key' not found 

Пожалуйста, задавайте мне любые вопросы, если что-то недостаточно ясно. Спасибо заранее.

+0

У Mojarra ранее были ошибки в разрешении функций EL в композитах. Какую версию Mojarra 2.2.x вы используете? Он работает, когда вы перемещаете 'xmlns: cx =" ... "' из корневого тега в тег ' '? Испытывали ли вы его вне композита, в обычном Facelet? – BalusC

+0

Я могу фактически выполнить функцию из композитов в моем .war Проблема заключается в композитах, которые находятся внутри .jar, где функция: S –

+0

-Version is 2.2.2 -hadn't попробовал это, но теперь Я сделал и до сих пор не работает :( -Да, я пробовал вне композита. Я называю это из многих мест внутри .war (не все из них являются композитами). Спасибо! –

ответ

1

Я решил. Проблема не имела ничего общего с внешними банками или вообще.

В моем коде я вызова функции в моем .xhtml так:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" 
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:cx="http://mycompany.com/taglib"> 

(...) 

    <li>#{i18n[cx:enum_key(cc.attrs.enumParam)]}: #{cc.attrs.afiliado.numeroDocumento}</li> 

(...) 

</composite:implementation> 
</html> 

и выражение EL должно быть внутри значения атрибута, как это:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" 
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:composite="http://java.sun.com/jsf/composite" xmlns:cx="http://mycompany.com/taglib"> 

(...) 

    <li><h:outputText value="#{i18n[cx:enum_key(cc.attrs.enumParam)]} #{cc.attrs.afiliado.numeroDocumento}" /></li> 

(...) 

</composite:implementation> 
</html> 

Таким образом, благодаря так или иначе!

+0

У вас есть красная селедка в вашем вопросе/ответе. Это 'cx:' или 'cnx:'? – BalusC

+0

Спасибо за предупреждение! Уже отредактировано это было cx: в обоих случаях –