2011-09-20 12 views
27

मेरे स्प्रिंग 3.0 ऐप में, मेरे पास /WEB-INF/dir में कुछ संसाधन हैं। रनटाइम पर मुझे उनमें से कुछ को InputStream (या किसी अन्य प्रकार) के रूप में चाहिए। मैं उन्हें कैसे प्राप्त कर सकता हूं? क्या उन्हें सामान्य Resource के रूप में इंजेक्ट करना संभव है?स्प्रिंग 3.0 संसाधनों के रूप में फ़ाइलों को इंजेक्ट करें

उत्तर

54

यहाँ टिप्पणी द्वारा यह करने के लिए एक आसान तरीका है:

import org.springframework.core.io.Resource; 

@Value("classpath:<path to file>") 
private Resource cert; 
+0

यह बहुत अच्छा है! – Kong

+1

कोई निर्देशिका कैसे लोड की जा सकती है इस पर कोई विचार? उदा।, एक निर्देशिका "डीआईआर" जिसमें 25 फाइलें –

+0

है, यह बहुत अच्छी है लेकिन जार फ़ाइल के अंदर काम नहीं कर सकती है। –

2

आप उपयोग करने के लिए सक्षम होना चाहिए:

Resource resource = appContext.getResource("classpath:<your resource name>"); 
InputStream is = resource.getInputStream(); 

जहां appContext अपने स्प्रिंग ApplicationContext है (विशेष रूप से, एक WebApplicationContext, जब से तुम एक webapp है)

+0

' संसाधन 'इंटरफ़ेस' getInputStream() 'विधि घोषित नहीं करता है, आपको' नया FileInputStream (resource.getFile()) 'कॉल करने की आवश्यकता होगी। –

+0

यह गलत है। 'संसाधन' को इंटरफ़ेस 'org.springframework.core.io.InputStreamSource' – Saket

+0

से प्राप्त होता है मेरा बुरा, क्षमा करें,' उपकरण 'नहीं देखा। –

-1

आप वसंत पर निर्भरता की स्थिति के लिए नहीं करना चाहते हैं , यहां विस्तृत दृष्टिकोण का पालन करें: Populate Spring Bean's File field via Annotation

+0

मैं यह देखने में असफल रहा कि उस प्रश्न के किसी भी उत्तर के परिणामस्वरूप वसंत पर निर्भरता कम हो गई है ... –

+0

मैं मानता हूं कि @Value का उपयोग शून्य वसंत निर्भरता नहीं है। –

+1

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

5

सभी ApplicationContext परिभाषा के अनुसार ResourceLoader एस हैं। इसका मतलब है कि वे अपने विन्यास में पाए गए संसाधन संसाधनों को हल करने में सक्षम हैं। इसे ध्यान में रखते हुए, आप अपने लक्ष्य बीन को एक सेटटर के साथ घोषित कर सकते हैं जो org.springframework.core.io.Resource स्वीकार करता है। फिर जब आप लक्ष्य बीन को कॉन्फ़िगर करते हैं, तो बस संपत्ति के मूल्य में संसाधन पथ का उपयोग करें। वसंत मूल्य को आपकी कॉन्फ़िगरेशन में Resource में परिवर्तित करने का प्रयास करेगा।

public class Target { 
    private Resource resource; 
    public void setResource(final Resource resource) { 
    this.resource = resource; 
    } 
} 

//configuration 
<beans> 
    <bean id="target" class="Target"> 
    <property name="resource" value="classpath:path/to/file"/> 
    </bean> 
</beans> 
1

क्लासपाथ संसाधन पुनर्प्राप्त करने के लिए यहां एक पूर्ण उदाहरण है। मैं इसका इस्तेमाल किया है कि वास्तव में जटिल प्रश्न जो मैं जावा वर्गों में स्टोर करने के लिए नहीं करना चाहती एसक्यूएल फ़ाइल को पकड़ने की:

public String getSqlFileContents(String fileName) { 
    StringBuffer sb = new StringBuffer(); 
    try { 
     Resource resource = new ClassPathResource(fileName); 
     DataInputStream in = new DataInputStream(resource.getInputStream()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      sb.append(" " + strLine); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 
संबंधित मुद्दे