我使用所谓的<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 ......如果可能的话)
由于