来自位于同一 jar 中的 xhtml 的引用 EL 函数

Reference EL function from xhtml located in same jar

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

此外,在同一个 .jar 中,我有一个实用程序 class ( ViewUtils ),它具有我从位于我的 Web 项目中的 .xhtml 文件中调用的功能。

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

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

如果有什么地方不够清楚,请问我。 提前致谢。

我解决了。 该问题与外部 jar 或其他任何东西都没有任何关系。

在我的代码中,我是这样调用 .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>

所以,还是谢谢了!