2013-10-29 7 views
5

चलाते समय "आउटपुटस्ट्रीम पहले से उपयोग में है, जबकि कोई लेखक नहीं हो सकता है" मैं एक्सपीजेस से पीडीएफ बनाने के लिए पॉल कैलहुन के अपाचे एफओपी समाधान को लागू करने की कोशिश कर रहा हूं (नोट्स 9 # 102 से नोट्स)। मुझे प्रोजेक्ट करने वाले xAgent को चलाने का प्रयास करते समय निम्न जावा अपवाद प्राप्त हो रहा है -> आउटपुटस्ट्रीम पहले से उपयोग में है, जबकि कोई आउटपुटस्ट्रीम पहले से उपयोग में नहीं हैजावा अपवाद: xAgent

पॉल के कोड से किए गए एकमात्र परिवर्तन को बदलना था पैकेज का नाम जब एसएसजेएस लाइन के अपवाद होता है तो मैं अलग हो जाता हूं: var jce: DominoXMLFO2PDF = new DominoXMLFO2PDF(); वह सभी पंक्ति कक्षा को तुरंत चालू करती है, कोई कस्टम कन्स्ट्रक्टर नहीं होता है। मुझे विश्वास नहीं है कि यह कोड ही है, लेकिन कुछ कॉन्फ़िगरेशन समस्या है। एसएसजेएस कोड पहलेRenderResponse ईवेंट में है जहां यह होना चाहिए, मैंने xAgent पर कुछ भी नहीं बदला है।

मैंने पॉल के नमूना डेटाबेस से जार फ़ाइलों की प्रतिलिपि बनाई है, मैंने सत्यापित किया है कि निर्माण पथ दो डेटाबेस के बीच समान हैं। सब कुछ ठीक संकलित करता है (मैंने यह सब करने के बाद।) यह अपवाद केवल xpages केवल अपवाद प्रतीत होता है।

+0

ठीक है, मैं मूर्ख हूं, मैंने इसे समझ लिया, मेरा आयात xAgent में पैकेज विवरण गलत था। –

उत्तर

11

यहाँ क्या वास्तव में इस त्रुटि के साथ हो रहा है है: अनिवार्य रूप से servlets

XPages रहे हैं ... सब कुछ है कि एक सर्वलेट इंजन के शीर्ष पर एक XPage में होता है सिर्फ परतें। मूल रूप से दो प्रकार के डेटा होते हैं जो एक सर्वलेट कनेक्शन शुरू करने वाले किसी भी चीज़ को वापस भेज सकता है (जैसे ब्राउज़र): टेक्स्ट और बाइनरी।

एक सामान्य XPage टेक्स्ट भेजता है - विशेष रूप से, HTML। कुछ xAgents भी जेएसओएन या एक्सएमएल जैसे पाठ भेजते हैं। हालांकि, इनमें से किसी भी परिदृश्य में, डोमिनोज़ प्रतिक्रिया सामग्री भेजने के लिए जावा Writer का उपयोग करता है, क्योंकि राइटर्स को Character डेटा भेजने के लिए अनुकूलित किया गया है।

जब हमें बाइनरी सामग्री भेजने की आवश्यकता होती है, तो हम इसके बजाय OutputStream का उपयोग करते हैं, क्योंकि सामान्य बाइट डेटा भेजने के लिए धाराओं को अनुकूलित किया जाता है। तो अगर हम पीडीएफ, डीओसी/एक्सएलएस/पीपीटी, इमेज इत्यादि भेज रहे हैं, तो हमें एक स्ट्रीम का उपयोग करने की जरूरत है, क्योंकि हम बाइनरी डेटा भेज रहे हैं, टेक्स्ट नहीं।

पकड़ (जैसा कि आप जल्द ही देखेंगे, यह एक पन है) यह है कि हम केवल प्रति प्रतिक्रिया का उपयोग कर सकते हैं।

एक बार किसी भी HTTP क्लाइंट को बताया जाता है कि प्रतिक्रिया का प्रकार किस प्रकार है, यह उस सामग्री को संसाधित करने के बारे में धारणा बनाता है। इसलिए यदि आप इसे application/pdf की अपेक्षा करने के लिए कहते हैं, तो यह केवल बाइनरी डेटा प्राप्त करने की अपेक्षा करता है। इसके विपरीत, यदि आप इसे application/json की अपेक्षा करने के लिए कहते हैं, तो यह केवल चरित्र डेटा प्राप्त करने की अपेक्षा करता है। अगर प्रतिक्रिया में कोई डेटा शामिल है जो वादा किए गए सामग्री प्रकार से मेल नहीं खाता है, तो लगभग हमेशा संपूर्ण प्रतिक्रिया को अमान्य करता है।

तो डोमिनोज़ अपने अनंत ज्ञान में हमें केवल एक या दूसरे को एक ही अनुरोध में भेजने की अनुमति देता है, और अगर हम उस नियम का उल्लंघन करते हैं तो अपवाद फेंकता है।

दुर्भाग्य से ... अगर वहाँ हमारे कोड में किसी भी अपवाद है जब हम द्विआधारी सामग्री भेजने का प्रयास कर रहे हैं, डोमिनोज़ उपभोक्ता ... जो उत्पादन लेखक आह्वान करने के लिए एचटीएमएल रिपोर्टिंग भेजने का प्रयास करता करने के लिए रिपोर्ट करने के लिए है कि चाहता है कुछ गलत हो गया। सिवाय इसके कि आउटपुट स्ट्रीम पर हम पहले से ही एक हैंडल प्राप्त कर चुके हैं, इसलिए डोमिनोज़ को आउटपुट लेखक पर एक संभाल पाने की अनुमति नहीं है, क्योंकि यह केवल प्रति प्रतिक्रिया का उपयोग करने के खिलाफ अपने नियम का उल्लंघन करेगा। बदले में, आपके द्वारा रिपोर्ट किए गए अपवाद को फेंकता है, अपवाद को मास्क करना जो वास्तव में समस्या का कारण बनता है (आपके मामले में, शायद ClassNotFoundException)।

तो हम कैसे सुनिश्चित करते हैं कि हम वास्तविक समस्या देखें, और यह गलत दिशा नहीं है? हम try:

try { 
    /* 
    * Move all your existing code here... 
    */ 
} catch (e) { 
    print("Error generating dynamic PDF: " + e.toString()); 
} finally { 
    facesContext.responseComplete(); 
} 

दो कारण हैं इस एक पसंदीदा तरीका है: कुछ हमारे कोड के साथ गलत हो जाता है

  1. , तो हम न दें डोमिनोज़ इसके बारे में एक अपवाद फेंक देते हैं। इसके बजाए, हम इसे लॉग इन करते हैं (कंसोल और लॉग पर भेजने के लिए print का उपयोग करने के बजाय, आप इसे ओपनलॉग पर भी टॉस कर सकते हैं, या जो भी आपकी पसंदीदा लॉगिंग तंत्र हो सकती है)। इसका मतलब है कि डोमिनोज़ उपयोगकर्ता को त्रुटि की रिपोर्ट करने का प्रयास नहीं करता है, क्योंकि हमने वादा किया है कि हमने पहले से ही इसे स्वयं रिपोर्ट किया है।
  2. महत्वपूर्ण facesContext.responseComplete() कॉल finally ब्लॉक करने के लिए आगे बढ़ (है जो अंतत: डोमिनोज़ बताता है अपनी खुद की किसी भी सामग्री को न भेजने के लिए) से, यह यह निष्पादित हो जाएगा सुनिश्चित करता है। अगर हमने इसे try ब्लॉक के अंदर छोड़ दिया है, तो अपवाद होने पर यह छोड़ा जाएगा, क्योंकि हम सीधे catch पर छोड़ देंगे ... भले ही डोमिनोज़ हमारे अपवाद की रिपोर्ट नहीं कर रहा है क्योंकि हमने इसे पकड़ा है, फिर भी यह कोशिश करने का प्रयास करता है प्रतिक्रिया लेखक क्योंकि हमने यह नहीं बताया था।

यदि आप उपरोक्त पैटर्न का पालन करते हैं, और आपके कोड में कुछ गड़बड़ है, तो ब्राउज़र को अधूरा या भ्रष्ट फ़ाइल प्राप्त होगी, लेकिन लॉग आपको बताएगा कि क्या त्रुटि हुई है, इसके बजाय कुछ भी नहीं है समस्या के मूल कारण के साथ करो।

+0

वाह टिम, महान जवाब। आप निश्चित रूप से सर्वरसाइड पर गेटो लड़के हैं, आपके अनुभव को साझा करने के लिए धन्यवाद। यह वास्तव में बहुत कुछ समझाने में मदद करता है। –

+1

मेरी खुशी। जैसा कि आप कहते हैं, यह यहां अच्छा है ... बहुत से लोगों को इस त्रुटि का सामना करना पड़ता है और इसके अर्थ के बारे में समझ में आता है। –

0

मैंने लगभग इस प्रश्न को हटा दिया है, लेकिन अपवाद की खोज करते समय Google पर बहुत कम है क्योंकि इसे स्वयं जवाब देने का फैसला किया है।

समस्या xAgent में थी, एक लाइन आयात पैकेज है जो गलत था। इसे ठीक करने से सबकुछ काम करता है। अपवाद कथन: "आउटपुटस्ट्रीम पहले से उपयोग में है, जबकि एक लेखक प्राप्त नहीं कर सकता" काफी भ्रामक है। मुझे नहीं पता कि यह अपवाद किस प्रकार ट्रिगर करता है, लेकिन एक वैकल्पिक वर्णन "जावा क्लास ?? yourClass?" नहीं मिला "

यदि आपको यह प्रश्न मिलता है, तो आपके पास एक ही समस्या हो सकती है। मैं अनदेखा करता हूं कि अपवाद वास्तव में क्या कहता है, और अपने आवेदन के दौरान अपने पैकेज विवरणों की जांच करें। जावा कोड स्वयं ही त्रुटि करेगा, लेकिन जावा का संदर्भ देने वाले आपके एसएसजेएस रनटाइम तक त्रुटि नहीं करेंगे, उस कोड पर ध्यान दें।

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