来自xhtml的参考EL函数位于同一个jar中

时间:2015-02-02 18:41:50

标签: maven jsf el taglib

所以,我有一个jar包含几个常见的.xhtml文件,我在我的web项目(Wildfly 8.1服务器中的JSF2.2)中使用它作为自定义组件。

此外,在同一个.jar中,我有一个实用程序类(ViewUtils),它具有我从我的web项目中的.xhtml文件调用的函数。

问题是我实际上想从位于函数所在的同一个jar中的.xhtml文件中访问该EL函数,但我不能。 JBoss说EL表达式无法识别。但是,我可以从位于我的Web项目(.war)<。p>中的.xhtml文件中调用该函数

我自己解释一下吗? 这是代码。

这是我的.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>

这是位于我的.war

中的.xhtml
<?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

如果问题不够清楚,请问我任何问题。 提前谢谢。

1 个答案:

答案 0 :(得分: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>

所以,谢谢!