扩展 EL-Context 以获得一些值

Expand EL-Context for some value

xhtml 中的示例有效,因为 #{row} 是在 p:dataTable 中定义的。如果我不在 p:dataTable 的上下文中调用 getData,它会 returns null。有关方法 returns null 的这种情况,请参阅 Values.iterateOverDatatableValues。我如何定义 row 以在我的上下文中使用。可能有数据表一些函数来迭代值,以便定义 #{row}

Java:

@Named
@SessionScoped
class Test {
  public Object getData () {
     return Faces.evaluateExpressionGet("#{row.someProperty}"); //The String "#{row.someProperty}" comes from a collection.
  }
}

XHTML #{row}Test.getData() 中定义:

<p:dataTable value="#{bean.values}" var="row">

   <p:column>
      <h:outputText value="#{test.data}" />
   </p:column>
</p:dataTable>

Java,#{row}未定义:

class Values {
  @Inject
  Test test;

  public void iterateOverDatatableValues (){
    DataTable dt = Components.findComponent("datatableId");
    for (Object o : dt.getValues()){
      test.getData(); // <---- NULL because #{row} is not defined. 
    }
  }
}

解决方案是使用 expressionFactory().createValueExperssion 方法。

private void setRowEL(Object o) {
    ELContext elContext = Faces.getELContext();
    ExpressionFactory expressionFactory = Faces.getApplication().getExpressionFactory();
    ValueExpression aliasValueExpression = expressionFactory.createValueExpression(elContext, "#{row}", MyValue.class);
    aliasValueExpression.setValue(elContext, o);
}