2010-09-02 10 views
8

मैं ओडब्ल्यूएएसपी से एंटी-सैमी का उपयोग करना चाहता हूं। उन्हें नीति ऑब्जेक्ट मिला, जिसे फ़ैक्टरी विधि के माध्यम से तुरंत चालू किया गया है।वसंत: एक कारखाने-विधि में इनपुटस्ट्रीम के रूप में संसाधन इंजेक्शन

public static Policy getInstance(InputStream inputStream); 

फ़ैक्टरी-विधि को पारित करने की आवश्यकता इनपुट इनपुट जो नीति-ऑब्जेक्ट के लिए कॉन्फ़िगरेशन फ़ाइल का प्रतिनिधित्व करता है।

क्या वसंत xml संदर्भ कॉन्फ़िगरेशन में नीति बीन बनाने का उपयोग करना संभव है? मुझे पता है कि एक संसाधन ऑब्जेक्ट है, जो क्लासपाथ से फ़ाइलें लोड कर सकता है। लेकिन मुझे उस संसाधन ऑब्जेक्ट से इनपुटस्ट्रीम बनाने की आवश्यकता है। क्या मैं इसे सीधे एक्सएमएल-वसंत-संदर्भ में कर सकता हूं? या इनपुट इनपुट प्राप्त करने के लिए मुझे जावा कोड लिखने की ज़रूरत है?

उत्तर

15

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

  • Instantiation with a static factory method
  • Built-in Property Editors (InputStreamEditor यहाँ प्रासंगिक है)
  • Examples of Dependency Injection (पिछले अनुभाग के बारे में है constructor-arg एक स्थिर factory-method के संदर्भ में प्रयोग किया है:

    <bean id="policy" class="org.owasp.validator.html.Policy" 
        factory-method="getInstance"> 
    
        <!-- type needed because there is also a getInstance(String) method --> 
        <constructor-arg 
         value="classpath:path/to/policyFile.xml" 
         type="java.io.InputStream" /> 
    
    </bean> 
    

    Spring Reference के निम्नलिखित भागों देखें)

+3

अरे, मुझे एहसास नहीं हुआ कि वसंत 'इनपुटस्ट्रीम' पर मजबूर हो सकता है, यह साफ है। नोट, हालांकि, वसंत 'इनपुटस्ट्रीम' को बंद नहीं करेगा, यह मानता है कि बीन इसे करेगा। यदि 'पॉलिसी' कक्षा उस स्ट्रीम को बंद नहीं करती है, तो आप एक रिसाव के साथ खत्म हो जाएगा। – skaffman

+0

अच्छी तरह से मनाया गया। नीति इनपुटस्ट्रीम को बंद नहीं करती है: http://code.google.com/p/owaspantisamy/source/browse/trunk/Java/current/antisamy-project/antisamy/src/main/java/org/owasp/validator/html /Policy.java#210। यह एक बग के रूप में रिपोर्ट किया जाना चाहिए, मुझे लगता है कि –

+0

एचएम, तो मैं जावा-कोड में इनपुटस्ट्रीम खोल और बंद कर दूंगा। हालांकि, निर्माण साफ दिखता है, लेकिन जब मैं इसे आज़माता हूं, तो मुझे फ़ाइल नॉटफाउंड अपवाद मिलता है, जो मुझे बताता है कि यह ' classpath: टेम्पो-antisamy.xml '। किसी भी तरह से classpath उपसर्ग फ़ाइल नाम से अलग नहीं है – nebenmir

4

@ seanizer का समाधान अच्छा होगा यदि PolicyInputStream को इसे पढ़ने के बाद बंद कर दिया गया, लेकिन स्पष्ट रूप से यह नहीं है। इसका परिणाम एक रिसाव होगा, जिसकी गंभीरता इस बात पर निर्भर करती है कि इसे कितनी बार कहा जाता है, और संसाधन की प्रकृति।

सुरक्षित होने के लिए, आपको writing a custom FactoryBean implementation पर विचार करना चाहिए, जो InputStream को सुरक्षित रूप से खोलने और बंद करने पर संभालता है। FactoryBean को Resource ऑब्जेक्ट से इंजेक्शन दिया जाएगा।

+0

अपडेट करें यह सिंगलटन बीन के लिए कोई समस्या नहीं होनी चाहिए, लेकिन यह हो सकता है एक प्रोटोटाइप बीन में एक असली गड़बड़, मैं सहमत हूँ। –

+0

@seanizer: बस इतना। साथ ही, विंडोज़ पर जो ऐप चल रहा है, तब तक एक खुली फ़ाइल लॉक रखने जा रहा है, जो वास्तविक पिटा हो सकता है। – skaffman

+0

यह मानते हुए कि यह एक फाइल है और जार संसाधन नहीं है, हां –

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