如何在匿名类上调用JSF动作?EL无法访问

我想在我的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>

然后,我在session-scope上的门户将如下所示:

 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() );

}

但这不是我想要的方式…

回答:

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

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

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基于反射,所以这就是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;

}

}

以上是 如何在匿名类上调用JSF动作?EL无法访问 的全部内容, 来源链接: utcz.com/qa/404826.html

回到顶部