2009-03-02 16 views
9

How can I access the ServletContext from within a JAX-WS web service? के समान, क्या एप्लिकेशनकॉन्टेक्स्ट तक पहुंचने का कोई तरीका है, इससे आसान?मैं जेएक्स-डब्ल्यूएस वेब सेवा के भीतर से एप्लिकेशन कॉन्टेक्स्ट तक कैसे पहुंच सकता हूं?

import javax.annotation.Resource; 
import javax.jws.WebService; 
import javax.servlet.ServletContext; 
import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 

import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

@WebService 
public class MyWebService { 
    // boilerplate code begins :(

    @Resource 
    private WebServiceContext context; 
    private WebApplicationContext webApplicationContext = null; 

    /** 
    * @return 
    * @throws IllegalStateException 
    */ 
    private WebApplicationContext getWebApplicationContext() 
      throws IllegalStateException { 
     if (webApplicationContext != null) 
      return webApplicationContext; 
     ServletContext servletContext = 
       (ServletContext) context.getMessageContext().get(
         MessageContext.SERVLET_CONTEXT); 
     webApplicationContext = 
       WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 
     return webApplicationContext; 
    } 
} 

उत्तर

1

में चेनिंग मुझे नहीं लगता कि वेब सेवा वेब या सर्वलेट संदर्भों या अपने आवेदन संदर्भ के बारे में पता करने के लिए होना चाहिए से पहले ServletContext बचाता स्थापित होगा। मुझे नहीं पता कि इसे किसी भी को क्यों जानना चाहिए। क्या यह कहीं अधिक निष्क्रिय नहीं होना चाहिए? इंजेक्ट करें कि इसकी क्या ज़रूरत है और इसे अपना काम करने दें। किसी ग्राहक के साथ सेवा इंटरैक्शन को परिभाषित अनुबंध पर आधारित होना चाहिए। अगर इसे किसी प्रकार के संदर्भ से अज्ञात मूल्य प्राप्त करना है, तो ग्राहक कैसे जानेंगे कि इसे सेट करने की आवश्यकता है या इसे कैसे सेट किया जाए?

मैं आगे जाऊंगा और कहूंगा कि एक वेब सेवा स्प्रिंग सेवा इंटरफ़ेस के लिए एक रैपर होना चाहिए। इसे बेनकाब करने के सभी संभावित तरीकों के बीच यह सिर्फ एक और विकल्प है। आपकी वेब सेवा को XML अनुरोध/प्रतिक्रिया ऑब्जेक्ट्स के मार्शल और अनमशाल से थोड़ा अधिक करना चाहिए और स्प्रिंग सेवाओं के साथ सहयोग करना चाहिए।

+0

ठीक है, तो मैं स्प्रिंग सेवाओं के साथ कैसे सहयोग कर सकता हूं, अगर मैं यह नहीं कह सकता: appContext.getBean ('myBean')? – pihentagy

+0

इसे सेटटर या कन्स्ट्रक्टर के माध्यम से इंजेक्ट करें। निर्भरता इंजेक्शन का अर्थ है "हमें कॉल न करें; हम आपको कॉल करेंगे।" आपकी ऑब्जेक्ट्स को ऐप संदर्भ प्राप्त करने की आवश्यकता नहीं है जो उन्हें चाहिए। – duffymo

+0

आप नहीं कर सकते। यदि मैं ग्लासफ़िश के तहत अपनी वेब सेवा का परीक्षण करता हूं, तो एक नया webservice बनाया जाता है, और यह कॉन्फ़िगर नहीं किया गया है: -o यह ज्ञान प्राप्त करने के लिए एक दिवसीय लंबी डीबगिंग थी :( – pihentagy

0

मैं एक फिल्टर है कि एक ThreadLocal

1

अपनी वेब सेवा बीन एक वसंत बीन का विस्तार करें।

this

8
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.web.context.support.SpringBeanAutowiringSupport; 


@WebService( 
    endpointInterface = "Bla", 
    targetNamespace = "http://bla/v001", 
    wsdlLocation = "WEB-INF/wsdl/bla.wsdl",  
    serviceName = "BlaService", 
    portName = "BlaPort") 
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort { 

    @Autowired 
    @Qualifier("dao") 
    private Dao dao; 
    ... 
} 
+2

+1 मुझे 'स्प्रिंगबीनऑटोवायरिंगस्पोर्ट' की दिशा में इंगित करने के लिए धन्यवाद। मैं ग्लासफ़िश प्राप्त करने के लिए संघर्ष कर रहा था जेएक्स-डब्ल्यूएस के प्रबंधन को छोड़ने और इसे वसंत देने के लिए। यह एक बहुत ही आसान समाधान है और स्प्रिंग को उन चीज़ों पर ध्यान केंद्रित करने देता है जो यह अच्छा है। –

+0

I मैं काम करने के लिए समाधान प्राप्त करने की कोशिश कर रहा हूं लेकिन SpringBeanAutowiringSupport बस मेरी वेब सेवा पर असर नहीं लग रहा है। http://stackoverflow.com/questions/12869014/web-service-exposed-by-extending-springbeanautowiringsupport-is-failing-to-injec – AR3Y35

0

SpringBeanAutowiringSupport वर्ग के लिए JavaDoc के अनुसार की तरह, देखें: http://docs.spring.io/autorepo/docs/spring-framework/3.0.x/api/org/springframework/web/context/support/SpringBeanAutowiringSupport.html

नोट पढ़ें: जावाडोक के अंत में।

मूल प्रश्न, वास्तव में, यह तरीका हो सकता है कि इसे लागू किया जाना चाहिए।

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