2013-02-25 70 views
10

restlet में इस त्रुटि हो रही है:निर्माता मानकों के साथ Restlet सर्वर संसाधन की जरूरत

ForwardUIApplication ; Exception while instantiating the target server resource. 
java.lang.InstantiationException: me.unroll.forwardui.server.ForwardUIServer$UnsubscribeForwardUIResource 

और मैं वास्तव में क्यों पता है। यह क्योंकि मेरे निर्माता इस तरह दिखता है:

public UnsubscribeForwardUIResource(MySQLConnectionPool connectionPool) { 

और Restlet तो जैसे संसाधन तक पहुँचता है:

router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

समस्या मैं वास्तव में है कि ctor तर्क की जरूरत है। मैं इसे कैसे सुलभ बना सकता हूं? (ध्यान दें कि मैं किसी भी आईओसी ढांचे का उपयोग नहीं कर रहा हूं, केवल बहुत सारे सीटीओआर तर्क हैं लेकिन यह वास्तव में एक आईओसी पैटर्न है)।

उत्तर

10

आप अपने संसाधन उदाहरण में संदर्भ गुणों को पारित करने के लिए संदर्भ का उपयोग कर सकते हैं।

ServerResource API doc से:

डिफ़ॉल्ट निर्माता, अंतिम Resource.init का उपयोग कर इन्स्टेन्शियशन के बाद (संदर्भ, अनुरोध, प्रतिक्रिया) विधि शुरू हो जाती है, संदर्भ, अनुरोध और प्रतिक्रिया की स्थापना। आप Resource.doInit() विधि को ओवरराइड करके इसे रोक सकते हैं।

तो, लगाव समय:

router.getContext().getAttributes().put(CONNECTION_POOL_KEY, connectionPool); 
router.attach(Config.unsubscribeUriPattern(), UnsubscribeForwardUIResource.class); 

अपने UnsubscribeForwardUIResource वर्ग में आप विधि doInit डी करने के लिए निर्माता से प्रवर्तन कोड को स्थानांतरित करना होगा:

public UnsubscribeForwardUIResource() { 
    //default constructor can be empty 
} 

protected void doInit() throws ResourceException { 

    MySQLConnectionPool connectionPool = (MySQLConnectionPool) getContext().getAttributes().get(CONNECTION_POOL_KEY); 

    // initialization code goes here 
} 
1

यदि आप आईओसी का उपयोग नहीं कर रहे हैं तो आपको इसे मैन्युअल रूप से करना चाहिए, उदा। आप कक्षा के बजाय रेस्टलेट आवृत्ति संलग्न कर सकते हैं। गुणों को पुनर्प्राप्त करने के लिए आप Context का उपयोग कर सकते हैं।

लेकिन शायद आईओसी कंटेनर का उपयोग करने के लिए इसमें अधिक संभावना है जो इसे सरल बनायेगा और बॉयलरप्लेट कोड को कम करेगा, उदाहरण के लिए यह वसंत के लिए है: http://pastebin.com/MnhWRKd0

+0

प्रलेखन प्रति यह एक उदाहरण संलग्न करना संभव नहीं है। – djechlin

+0

ओह, आप सही हैं। आप 'Restlet' उदाहरण संलग्न कर सकते हैं, लेकिन 'सर्वर संसाधन' नहीं। क्या आप 'रीस्टलेट' का उपयोग कर सकते हैं? यदि नहीं, तो 'संदर्भ' से कनेक्शन को तार करने के लिए बस 'doInit' का उपयोग करें। – kan

+0

क्या आपने फ़िल्टर (org.restlet.routing.filter) का उपयोग करके इसे अटैच करने का प्रयास किया है? – Caleryn