2010-06-08 5 views
6

मैं अपने जेएसएफ (माइफेस 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"); 
     } 

और पोर्टल निर्माता

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 वर्ग के रूप में एक ही पैकेज में इस को क्रियान्वित करने का प्रयास करें और उसके बाद। दूसरे पैकेज में, आखिरी पंक्ति तब बिल्कुल एक ही अपवाद फेंक देगी। यही समस्या है क्योंकि ईएल प्रतिबिंब के आधार पर संघर्ष कर रहा है।

मुझे public (आंतरिक) class बनाने की तुलना में यह अच्छी तरह से हल करने के अन्य तरीकों को नहीं दिखता है। प्रतिबिंब (और इस प्रकार भी ईएल) उन्हें अन्य पैकेजों से एक्सेस कर सकता है।

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

+0

आपका स्वागत है। – BalusC

0

सवाल काफी पुराना है, लेकिन मैं आज ही समस्या मिले हैं, लेकिन मैं ग्लासफिश साथ जैस्पर ईएल पुस्तकालय की जगह इस मुद्दे को हल केवल क्योंकि मैं जेट्टी 7 से बिलाव 7.

करने के लिए स्विच है ईएल पुस्तकालय

+0

मैं भी जूएल एल के साथ इस मुद्दे को हल करता हूं –

संबंधित मुद्दे