7

我想在我的 JSF (MyFaces 1.2) 应用程序中有一个通用菜单。

<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");
         }

在 Portal 构造函数中

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

但这不是我想要的方式...

4

2 回答 2

11

这是因为无法从包含匿名类的包外部访问匿名类。

这是一个演示幕后发生的事情:

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除了创建一个(inner)之外,我没有看到其他方法可以很好地解决这个问题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;
    }

}
于 2010-06-10T15:25:27.187 回答
0

这个问题已经很老了,但我今天遇到了同样的问题,但这只是因为我已经从 Jetty 7 切换到了 Tomcat 7。

我通过用 GlassFish EL 库替换 Jasper EL 库来解决这个问题。

于 2012-10-05T16:09:54.460 回答