2008-09-25 20 views
13

J'utilise Java 6, Tomcat 6 et Metro. J'utilise les annotations WebService et WebMethod pour exposer mon service Web. Je voudrais obtenir des informations sur la demande. J'ai essayé le code suivant, mais wsCtxt est toujours nul. Quelle étape dois-je prendre à pas obtenir null pour le WebServiceContext. En d'autres termes: comment puis-je exécuter la ligne suivante pour obtenir une valeur non nulle pour wsCtxt?Comment puis-je avoir accès à l'objet HttpServletRequest lors de l'utilisation de Java Web Services?

MessageContext 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(); 
    } 

Répondre

10

Je vous recommande de renommer votre variable de wsCtxt en wsContext ou d'affecter l'attribut name à l'annotation @Resource. Le J2ee tutorial on @Resource indique que le nom de la variable est utilisé dans le cadre de la recherche. J'ai rencontré ce même problème en utilisant l'injection de ressources dans Glassfish en injectant un type différent de ressource.

Bien que votre nom correct ne soit pas wsContext. Je suis ce java tip. Si vous aimez le nom de la variable wsCtxt, puis utilisez l'attribut name dans la déclaration variable:

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

1

Peut-être que l'annotation javax.ws.rs.core.Context est ce que vous cherchez, au lieu de ressources?

3

J'ai encore ce problème. Voici mon travail-autour était d'écrire un ServletRequestListener qui met la demande dans une variable ThreadLocal. Ensuite, le WebService peut obtenir la requête à partir de ThreadLocal. En d'autres termes, je réimplémente quelque chose qui ne fonctionne tout simplement pas pour moi.

Voici le 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); 
    } 

} 

Voici l'emballage ThreadLocal:

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(); 
    } 

} 

Et le câblage web.xml:

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

Le service Web utilise le code suivant pour obtenir la demande:

final Demande HttpServletRequest = (HttpServletRequest) ServletRequestStore.getServletRequest();

3

Le code suivant fonctionne pour moi en utilisant Java 5, Tomcat 6 et Metro

pourrait-il être qu'il ya un conflit entre le support de WS en Java 6 et la version de Metro vous utilisez. L'avez-vous essayé sur une version Java 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; 
}