2010-06-08 21 views
6

JSF (MyFaces 1.2) uygulamasında genel bir menüye sahip olmak istiyorum.JSF eylemini anonim bir sınıfta nasıl çağırırsınız? EL erişemiyor

<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> 

Sonra oturum kapsamına benim portalı şu şekilde görünecektir:

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

Bu kodu çalıştırdığınızda ince gösterecektir. Eğer "ClickMe" komutu bağlantısını tıklayarak işlem yapmaya çalıştığınız Ama - Aşağıdaki istisna ortaya çıkar:

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

anonim sınıfların bir listesini görüntülemek için herhangi bir yolu var mı bu örnekte hangi bir yöntemi (dan ITemplate.action()) çalıştırılabilir?

Düzenleme: Ben (iç) sınıfı kullandığınızda Çalışıyor

. Gibi örneğin:

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

ve Portal yapıcı

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

Ama bu ben istediğim gibi değil de

...

anonim sınıfın da paket dışında erişilebilir olmadığından değil

cevap

10

anonim sınıfı içerir. İşte

perde arkasında neler olduğunu bir gösteri var:

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

paketin dışında başka bir sınıfta bir kez daha sonra Portal sınıfla aynı pakette bu yürütme deneyin. Diğer pakette, son satır tam olarak aynı istisnayı atardı. Bu, EL'nin yansıma temelli olduğundan dolayı uğraştığı problem.

Bu sorunu çözmenin başka yollarını, yalnızca public (iç) class oluşturmaktan çok görmüyorum. Yansıma (ve ayrıca EL) diğer paketlerden onlara erişebilir.

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

bu bir açıklama açıklamasıdır ve bu amaçla, bu çözüm gayet iyi çalışır. teşekkürler ++ – justastefan

+0

Rica ederim. – BalusC

0

soru oldukça eskidir ama bugün aynı sorunu karşılamıştır ama Jetty'e 7'den Tomcat 7.

anahtarı var çünkü sadece ben GlassFish ile Jasper EL kütüphanesini değiştirerek sorunu çözmek EL kütüphanesi.

+0

Ben de sorunu JUEL eliyle çözüyorum –