2011-10-20 43 views
0

如何在Seam管理的bean上以編程方式解析JSF EL表達式?我曾嘗試以下,但它不工作:在Seam管理的bean上以編程方式解析EL表達式

private String resolveExpression(String expression){ 

     if(expression == null) 
     { 
      return null; 
     } 

     javax.faces.context.FacesContext facesCtx = FacesContext.getCurrentInstance(); 
     Application app = facesCtx.getApplication(); 

     try 
     { 
      // Here we bind a value expression into the item, 
      // so it can dynamically change its language 
      ELContext elCtx = facesCtx.getELContext(); 
      ExpressionFactory ef = app.getExpressionFactory(); 
      ValueExpression ve = ef.createValueExpression(elCtx, expression, String.class); 

      return (String) ve.getValue(elCtx); 
     } 
     catch (ELException ex) { 
     } 

     return expression; 
    } 

在我的應用我有一顆豆名爲User,在煤層的會話範圍坐着,這個bean有一個屬性name。 EL表達式爲#{usr.name},但此表達式在Facelet文件中正常工作時返回空。

+0

你試過#{} usr.username? – flash

+0

抱歉'name'不是'用戶名':D – Barcelona

+0

也許你不應該在這裏消除'ELException'。嘗試記錄該異常,也許這給了你一些提示。 – flash

回答

3

Seam提供了處理兩項實用組件EL表達式:ExpressionsInterpolator

對於您的特定用例,我相信Interpolator是正確的選擇,因爲您並不需要有效的ValueExpressionInterpolator解析EL表達式的整個字符串並將其全部轉換爲其評估值。

請注意,Interpolator#interpolate()也接受參數(請參閱documentation)。

例子:

@Name("bean") 
@Scope(ScopeType.SESSION) 
class MyBean { 
    ... 

    public String getValue() { 
      return value; 
    } 

    ... 
} 

@Name("otherBean") 
@Scope(ScopeType.EVENT) 
class MyBean { 
    ... 

    public String getInterpolatedValue() { 
      return Interpolator.instance().interpolate("#{bean.value}"); 
    } 

    ... 

} 
1

Seam提供了一個Expressions對象。我現在使用這個,它運作良好。把你的物體插入事件上下文和調用。

Expressions.instance()createValueExpression(串).getValue()

更新:該類稱爲表達式

+0

感謝您的幫助Frey,但它仍然不起作用:( – Barcelona

+0

嗨。你確定你正在訪問一個已經存在的變量嗎?如果你得到一個空的getValue()由於hello被定義爲表達式中的字符串(帶有單引號),所以必須返回hello。我使用這種方法從模板創建電子郵件,我可以使用在創建時可用的任何東西。工廠。組件。展開任何上下文中的變量。 –

+0

我試圖用同一個用戶註銷並重新登錄,我得到了這個值,但是當我和其他用戶再次登錄時,我得到了以前用戶的信息。:(:( – Barcelona