使用EL函数使用EL表达式编程创建JSF组件会抛出javax.el.E​​LException:找不到函数

时间:2015-01-22 01:05:58

标签: jsf jsf-2 el

我使用所谓的<p:column>以编程方式为<p:dataTable>创建PrimeFaces BaseColumnHandler。这里有一列显示图标与否,具体取决于行实体给出的某些条件(此处为'事件')。

在JSF中,这看起来像这样(在<p:dataTable ... var="event" ...>内):

<p:column ...>
    <p:graphicImage value="/resources/somePath/to/icon/whatever.png"
                    title="#{of:format1('{0} conflicts available', event.results.size())}"
                    style="#{event.whatEverVisibleCondition ? '' : 'visibility: hidden;'}"
                    ... />
    <p:graphicImage value="/resources/somePath/to/icon/whatsoever.png"
                    title="What so ever available"
                    style="#{event.whatSoEverVisibleCondition ? '' : 'visibility: hidden;'}"
                    ... />

</p:column>

这只显示一个信息列,其中每一行(事件实体)都显示可用功能的图标(CSS visibility: hidden;替换JSF rendered属性,因为我们需要图标空间在不可见的情况下使用,以便图标对齐)。

请假设图标路径正确。

在构建图标列的类中,我有以下几行:

@Named
@ViewScoped
public class MyColumnHandler
{
    // get necessary instances to handle value expressions
    FacesContext      facesContext     = FacesContext.getCurrentInstance();
    ELContext         elContext        = facesContext.getELContext();
    ExpressionFactory factory          = facesContext.getApplication().getExpressionFactory();

    @PostConstruct
    public void buildColumns()
    {
        ...

        UIGraphic graphicImage = new GraphicImage();
        this.setTitleExpressionToComponent(graphicImage, "#{of:format1('{0} conflicts available', event.results.size())}");

        ...
    }

    private void setTitleExpressionToComponent(UIComponent component, String expression)
    {
        // expression goes to "title" attribute and is of type String
        component.setValueExpression("title", this.factory.createValueExpression(this.elContext, expression, String.class));
    }

    ...
}

当我渲染页面时,我得到这样的东西:

javax.el.ELException: Function 'of:format1' not found
    at com.sun.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:254)
    at com.sun.el.parser.SimpleNode.accept(SimpleNode.java:172)
    at com.sun.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:219)
    at com.sun.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:230)
    at com.sun.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:273)
    at com.sun.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:98)
    at org.jboss.weld.util.el.ForwardingExpressionFactory.createValueExpression(ForwardingExpressionFactory.java:49)
    at org.jboss.weld.el.WeldExpressionFactory.createValueExpression(WeldExpressionFactory.java:50)
    at com.company.ci.common.view.framework.columnhandling.MyColumnHandler.setTitleExpressionToComponent(MyColumnHandler.java:121)

显然,EL无法找到OmniFaces函数format1

但我已将xmlns:of="http://omnifaces.org/functions"添加到我能够想到的每个文件中,该文件正在导致异常的页面上使用。

如何使OmniFaces of:format1函数可用,以便不抛出异常,我该怎么办? (希望这个解决方案不需要我用自定义类替换一些ELContext ......如果可能的话)

由于

0 个答案:

没有答案