所以,我有一个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
如果问题不够清楚,请问我任何问题。 提前谢谢。
答案 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>
所以,谢谢!