2008-09-25 16 views
13

का उपयोग करते समय मैं HttpServletRequest ऑब्जेक्ट तक पहुंच कैसे प्राप्त कर सकता हूं मैं जावा 6, टॉमकैट 6 और मेट्रो का उपयोग कर रहा हूं। मैं अपनी वेब सेवा का पर्दाफाश करने के लिए वेब सेवा और वेबमाइट एनोटेशन का उपयोग करता हूं। मैं अनुरोध के बारे में जानकारी प्राप्त करना चाहता हूं। मैंने निम्नलिखित कोड की कोशिश की, लेकिन wsCtxt हमेशा शून्य है। पर मुझे क्या कदम उठाना चाहिए WebServiceContext के लिए शून्य प्राप्त करें।जावा वेब सेवा

दूसरे शब्दों में: wsCtxt के लिए गैर-शून्य मान प्राप्त करने के लिए मैं निम्न पंक्ति को कैसे निष्पादित कर सकता हूं?

संदेश कॉन्टेक्स्ट msgCtxt = wsCtxt.getMessageContext();

@WebService 
public class MyService{ 

    @Resource 
    WebServiceContext wsCtxt; 

    @WebMethod 
    public void myWebMethod(){ 
    MessageContext msgCtxt = wsCtxt.getMessageContext(); 
    HttpServletRequest req = (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST); 
    String clientIP = req.getRemoteAddr(); 
    } 

उत्तर

10

मैं आपको या तो अपने चर का नाम wsCtxt से wsContext में बदलता हूं या @Resource एनोटेशन में नाम विशेषता निर्दिष्ट करता हूं। J2ee tutorial on @Resource इंगित करता है कि चर का नाम लुकअप के हिस्से के रूप में उपयोग किया जाता है। मुझे ग्लासफिश में संसाधन इंजेक्शन का उपयोग करके एक ही प्रकार का संसाधन इंजेक्शन देने में एक ही समस्या का सामना करना पड़ा है।

हालांकि आपका सही नाम wsContext नहीं हो सकता है। मैं इस java tip का पालन कर रहा हूं। आप चर नाम wsCtxt चाहते हैं, तो चर घोषणा में नाम विशेषता का उपयोग करें:

@Resource(name="wsContext") WebServiceContext wsCtxt;

1

शायद javax.ws.rs.core.Context एनोटेशन संसाधन के बजाय, आप के लिए क्या देख रहे है?

3

मैं अभी भी इस समस्या है। यहां मेरा काम-आसपास एक ServletRequestListener लिखना था जो अनुरोध को थ्रेडलोकल var में डालता है। फिर वेब सेवा थ्रेडलोकल से अनुरोध प्राप्त कर सकती है। दूसरे शब्दों में, मैं कुछ ऐसा कर रहा हूं जो सिर्फ मेरे लिए काम नहीं करता है।

import javax.servlet.ServletRequest; 

public class ServletRequestStore { 

    private final static ThreadLocal<ServletRequest> servletRequests = new ThreadLocal<ServletRequest>(); 

    public static void setServletRequest(ServletRequest request) { 
     servletRequests.set(request); 
    } 

    public static ServletRequest getServletRequest() { 
     return servletRequests.get(); 
    } 

} 

और web.xml तारों:

<listener> 
     <listener-class>ecb.sdw.webservices.SDMXRequestListener</listener-class> 
    </listener> 

वेब सेवा प्राप्त करने के लिए निम्नलिखित कोड का उपयोग करता

import javax.servlet.ServletRequest; 
import javax.servlet.ServletRequestEvent; 
import javax.servlet.ServletRequestListener; 

public class SDMXRequestListener implements ServletRequestListener { 

    public SDMXRequestListener() { 
    } 

    public void requestDestroyed(ServletRequestEvent event) { 
    } 

    public void requestInitialized(ServletRequestEvent event) { 
     final ServletRequest request = event.getServletRequest(); 
     ServletRequestStore.setServletRequest(request); 
    } 

} 

यहाँ ThreadLocal आवरण है:

यहाँ श्रोता है अनुरोध:

अंतिम HttpServletRequest अनुरोध = (HttpServletRequest) ServletRequestStore.getServletRequest();

3

निम्नलिखित कोड मुझे जावा 5, बिलाव 6 और मेट्रो

का उपयोग कर यह संभवतः हो सकता है जावा 6 में WS समर्थन और आप उपयोग कर रहे मेट्रो के संस्करण के बीच एक संघर्ष है कि वहाँ के लिए काम करता है। क्या आपने जावा 5 बिल्ड पर इसे आजमाया है?

@WebService 
public class Sample { 
    @WebMethod 
    public void sample() { 
     HttpSession session = findSession(); 
     //Stuff 

    } 
    private HttpSession findSession() { 
     MessageContext mc = wsContext.getMessageContext(); 
     HttpServletRequest request = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST); 
     return request.getSession(); 
    } 
    @Resource 
    private WebServiceContext wsContext; 
} 
संबंधित मुद्दे