2010-05-09 5 views
39

मैं एक जावा वेब अनुप्रयोग में निम्नलिखित संरचना है:getResourceAsStream() हमेशा लौटने अशक्त

TheProject 
    -- [Web Pages] 
    -- -- [WEB-INF] 
    -- -- -- abc.txt 
    -- -- index.jsp 
    -- [Source Packages] 
    -- -- [wservices] 
    -- -- -- WS.java 

WS.java में, मैं एक वेब विधि में निम्नलिखित कोड का उपयोग कर रहा:

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

लेकिन यह हमेशा एक शून्य वापस आ रहा है। मुझे उस फ़ाइल से पढ़ने की ज़रूरत है, और मैंने पढ़ा है कि यदि आप WEB-INF में फ़ाइलों को डालते हैं, तो आप उन्हें getResourceAsStream के साथ एक्सेस कर सकते हैं, फिर भी विधि हमेशा null लौटा रही है।

कोई भी विचार जो मैं गलत कर रहा हूं?

Btw, अजीब बात यह है कि इस काम कर रहा था, लेकिन उसके बाद मैं परियोजना पर एक Clean and Build प्रदर्शन किया, यह अचानक काम करना बंद कर:/

उत्तर

35
मेरी जानकारी के लिए

फ़ाइल जहां फ़ोल्डर में सही होने की 'this' है वर्ग रहता है, यानी WEB-INF/classes में नहीं बल्कि भी गहरी नेस्ट (जब तक आप एक डिफ़ॉल्ट पैकेज में लिखना):

net/domain/pkg1/MyClass.java 
net/domain/pkg1/abc.txt 

अपने जावा सूत्रों के में फ़ाइल लाना काम करना चाहिए, संकलक प्रतियां कि वर्ग फ़ाइलों के साथ एक साथ फाइल।

+0

+1 चीयर्स साथी, यह काम किया। मैंने फ़ाइल को 'wservices' में ले जाया है और अब यह काम कर रहा है –

+3

यदि आप एक्लिप्स का उपयोग कर रहे हैं, तो आपको' F5 '(रीफ्रेश) भी हिट करने की आवश्यकता है ताकि आपका' abc.txt 'पैकेज एक्सप्लोरर में दिखाई दे, अन्यथा getResource() हमेशा शून्य । –

+0

मैंने पाया कि यूनिट परीक्षण ग्रहण/मेवेन में फ़ाइल के स्थान के लिए अधिक क्षमा कर रहे थे, लेकिन जब फ़ाइल को पैक और तैनात किया गया तो केवल तभी काम किया जब मैंने कक्षा के स्थान से मिलान करने के लिए इसे स्थानांतरित किया क्योंकि इस उत्तर की सिफारिश की गई थी। –

28

कक्षा लोडर को Class#getResourceAsStream(String) प्रतिनिधियों को कॉल और संसाधन वर्ग पथ में खोजा जाता है। दूसरे शब्दों में, आप वर्तमान कोड काम नहीं करेंगे और आपको WEB-INF/classes में, या WEB-INF/lib में एक जार फ़ाइल में पैक किया जाना चाहिए।

या उपयोग ServletContext.getResourceAsStream(String) जो , सर्वलेट कंटेनर एक संसाधन किसी भी स्थान से एक सर्वलेट के लिए उपलब्ध बनाने के लिए अनुमति देता एक वर्ग लोडर का उपयोग किए बिना। तो एक सर्वलेट से इस का उपयोग करें:

this.getServletContext().getResourceAsStream("/WEB-INF/abc.txt") ; 

लेकिन वहाँ एक तरह से मैं अपने वेब सेवा से getServletContext कॉल कर सकते हैं क्या है?

आप JAX-WS उपयोग कर रहे हैं, तो आप प्राप्त कर सकते हैं एक WebServiceContext इंजेक्शन:

@Resource 
private WebServiceContext wsContext; 

और फिर यह से ServletContext मिलती है:

ServletContext sContext= wsContext.getMessageContext() 
          .get(MessageContext.SERVLET_CONTEXT)); 
+2

लेकिन क्या कोई तरीका है कि मैं अपनी वेब सेवा से 'getServletContext' कह सकता हूं? –

5

मैं अगर पता नहीं है यह जेएक्स-डब्ल्यूएस पर लागू होता है, लेकिन जेएक्स-आरएस के लिए मैं एक ServletContext इंजेक्शन करके फ़ाइल को एक्सेस करने में सक्षम था और उसके बाद getResourceAsStream() को कॉल कर रहा था:

@Context ServletContext servletContext; 
... 
InputStream is = servletContext.getResourceAsStream("/WEB-INF/test_model.js"); 

ध्यान दें कि, कम से कम ग्लासफ़िश 3.1 में, पथ को पूर्ण होना चाहिए, यानी, स्लैश के साथ शुरू करें। यहां अधिक: How do I use a properties file with jax-rs?

6

मुझे लगता है कि इस तरह से आप फ़ाइल को "कहीं भी" (सर्वर स्थानों सहित) से प्राप्त कर सकते हैं और आपको इसकी देखभाल करने की आवश्यकता नहीं है।

आमतौर पर ऐसी चीजों की देखभाल करने के लिए यह एक बुरी आदत है।

Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 
1

मुझे वही समस्या थी जब मैंने वेबस्पेयर 8.5 से वेबस्पेयर लिबर्टी में बदल दिया था।

मैंने का उपयोग getResourceAsStream() के बजाय किया, क्योंकि किसी कारण से वेबस्पेयर लिबर्टी WEB-INF फ़ोल्डर में फ़ाइल का पता नहीं लगा सकता है।

स्क्रिप्ट था:

FileInputStream fis = new FileInputStream(getServletContext().getRealPath("/") 
         + "\WEBINF\properties\myProperties.properties") 

नोट: मैं केवल विकास के लिए इस स्क्रिप्ट का इस्तेमाल किया।

8
के बजाय

InputStream fstream = this.getClass().getResourceAsStream("abc.txt"); 

उपयोग

InputStream fstream = this.getClass().getClassLoader().getResourceAsStream("abc.txt"); 

इस तरह से यह वर्तमान प्रेरक वर्ग के मार्ग से नहीं जड़ से दिखाई देगा,

0

मैं एक ऐसी ही समस्या थी और मैंने थोड़ी देर के लिए समाधान की खोज की: ऐसा प्रतीत होता है कि स्ट्रिंग पैरामीटर केस संवेदनशील है। तो यदि आपका फ़ाइल नाम abc.TXT है लेकिन आप abc.txt की खोज करते हैं, ग्रहण इसे मिलेगा - निष्पादन योग्य JAR फ़ाइल नहीं होगी।