2010-06-08 51 views
6

我想在我的JSF(MyFaces 1.2)應用程序中有一個通用菜單。如何在匿名類上調用JSF操作? EL無法訪問它

<h:form> 
    <h:dataTable id="dt1" value="#{portal.actionList}" var="item"> 
    <f:facet name="header"> 
     <h:outputText value="Menu" /> 
    </f:facet> 
    <h:column> 
     <h:commandLink action="#{item.action}"> 
      <h:outputText value="clickme"/> 
     </h:commandLink> 
    </h:column> 
    </h:dataTable> 
</h:form> 

然後我對會話範圍的門戶應該是這樣的:

class Portal { 
    private ArrayList<IAction> list = new ArrayList<IAction>(); 

    public Portal() { 
     list.add(new IAction() { 
       public action() { 
        log.info("called action here"); 
       } 
     }); 
    } 
    public ArrayList<IAction> getActionList() { 
     return list; 
    } 
} 

當我運行這段代碼就會顯示效果細膩。但是,當您嘗試通過點擊「clickme」命令鏈接爲執行動作 - 將出現以下異常:

Class org.apache.el.parser.AstValue can not access a member of class Portal$1 with modifiers "public" 

有什麼辦法來顯示匿名類的列表,從該方法(在這個例子中ITemplate.action())可以執行?

編輯:

它的工作原理,當我使用的(內部)類。例如像:

class Bla implements IAction { 
     public void action() { 
      log.info("yes, i am working"); 
     } 

,並在門戶網站構造

public Portal() { 
    list.add(new Bla()); 
} 

但是,這不是我想要的方式...

回答

10

這是因爲匿名類是從包的外部無法訪問包含匿名類。

這裏有一個示範發生了什麼幕後:

public static void main(String[] args) throws Exception { 
    Portal portal = new Portal(); 
    Object list = portal.getClass().getDeclaredMethod("getActionList", null).invoke(portal, null); 
    Object action = list.getClass().getDeclaredMethod("get", new Class[] { int.class }).invoke(list, 0); 
    action.getClass().getDeclaredMethod("action", null).invoke(action, null); 
} 

在包外的其他類嘗試在同一個包Portal類執行此操作,然後再一次。在另一個包中,最後一行會拋出完全相同的異常。這是EL正在努力解決的問題,因爲它基於反思。

我看不到其他方法來解決這個問題,而不僅僅是創建一個public(內部)class。反射(也就是EL)可以從其他包中訪問它們。

public class Portal { 

    private List<IAction> list = new ArrayList<IAction>(); 

    public Portal() { 
     list.add(new IActionImpl()); 
    } 

    public class IActionImpl implements IAction { 
     public void action() { 
      System.out.println("called action here"); 
     } 
    } 

    public List<IAction> getActionList() { 
     return list; 
    } 

} 
+0

這是一個理解的解釋,爲此,此解決方案工作得很好。謝謝++ – justastefan 2010-06-11 13:49:57

+0

不客氣。 – BalusC 2010-06-11 13:51:54

0

的問題是很老,但我遇到了今天同樣的問題,但僅僅是因爲我有開關從碼頭7到Tomcat 7

我用了GlassFish更換碧玉EL庫解決問題EL庫。

+0

我也用JUEL el解決了這個問題 – 2012-10-05 16:57:47