2009-01-21 12 views
24

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

सर्वलेट में मेरे वसंत बीन के संदर्भ को पकड़ने का सबसे आसान तरीका क्या है?

जेबॉस वेब सेवाएं आपको @Resource एनोटेशन का उपयोग करके अपनी सेवा कक्षा में WebServiceContext इंजेक्ट करने की अनुमति देती हैं। क्या कुछ तुलनात्मक है जो सादे servlets में काम करता है? इस विशेष समस्या को हल करने के लिए एक वेब सेवा अखरोट को कुचलने के लिए एक स्लेजहैमर का उपयोग करेगी।

उत्तर

31

आपका सर्वलेट WebApplicationContextUtils का उपयोग आवेदन संदर्भ प्राप्त करने के लिए कर सकते हैं, लेकिन फिर अपने सर्वलेट कोड स्प्रिंग फ्रेमवर्क पर सीधा निर्भरता होगा।

एक अन्य समाधान आवेदन संदर्भ कॉन्फ़िगर विशेषता के रूप में सर्वलेट संदर्भ के लिए वसंत सेम निर्यात करने के लिए है:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter"> 
    <property name="attributes"> 
    <map> 
     <entry key="jobbie" value-ref="springifiedJobbie"/> 
    </map> 
    </property> 
</bean> 

आपका सर्वलेट

SpringifiedJobbie jobbie = (SpringifiedJobbie) getServletContext().getAttribute("jobbie"); 
+0

अच्छा, धन्यवाद। –

+0

इस तरह से ऐसा करने का लाभ क्या है और WebApplicationContextUtils का उपयोग नहीं कर रहा है? किसी भी तरह से यह वसंत से बंधे हैं। – Elliot

+5

सर्वलेट संदर्भ विशेषता को पॉप्युलेट करने के लिए तंत्र को वसंत का उपयोग करके लागू नहीं किया जाना चाहिए। स्टार्टअप पर चलने वाला एक फ़िल्टर या कोई अन्य सर्वलेट सर्वलेट संदर्भ विशेषता को पॉप्युलेट कर सकता है। –

7

मैं एक तरह से यह करने के लिए मिल गया है:

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 
SpringifiedJobbie jobbie = (SpringifiedJobbie)context.getBean("springifiedJobbie"); 
58

वहाँ का उपयोग कर सर्वलेट संदर्भ से सेम प्राप्त कर सकते हैं ऐसा करने के लिए एक और अधिक परिष्कृत तरीका है। नहीं है SpringBeanAutowiringSupport अंदर org.springframework.web.context.support है कि आप कुछ इस तरह के निर्माण की अनुमति देता है:

public class MyServlet extends HttpServlet { 

    @Autowired 
    private MyService myService; 

    public void init(ServletConfig config) { 
    super.init(config); 
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, 
     config.getServletContext()); 
    } 
} 

यह ApplicationContext है कि ServletContext (जैसे ContextLoaderListener के माध्यम से बनाया) बंधे देखने के लिए वसंत और वसंत कि ApplicationContext में उपलब्ध सेम इंजेक्षन कारण होगा।

+4

वसंत 2.5.x में यह SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (यह) होना चाहिए; जो स्वचालित रूप से बाकी को संभालता है। बहुत बढ़िया टिप बीटीडब्ल्यू। – Lajcik

+1

यदि आपको किसी भी ServletConfig तक पहुंचने की आवश्यकता है, तो सुनिश्चित करें कि आप "init" विधि में "super.init (config)" को कॉल करते हैं; उदा। सार्वजनिक शून्य इनिट (ServletConfig कॉन्फ़िगर) { super.init (config); स्प्रिंगबीनऑटॉयरिंगस्परपोर्ट.प्रोसेस इंजेक्शनबेसऑनसर्वलेट कॉन्टेक्स्ट (यह, config.getServletContext()); } – tamsler

+0

संकेत के लिए धन्यवाद, अच्छी पकड़! –