Comment puis-je accéder à l'objet HttpServletRequest lors de l'utilisation des services Web Java?

StackOverflow https://stackoverflow.com/questions/133436

Question

J'utilise Java 6, Tomcat 6 et Metro. J'utilise les annotations WebService et WebMethod pour exposer mon service Web. Je souhaite obtenir des informations sur la demande. J'ai essayé le code suivant, mais wsCtxt est toujours nul. Quelle étape dois-je prendre pour ne pas obtenir la valeur null pour WebServiceContext.

En d'autres termes: comment puis-je exécuter la ligne suivante pour obtenir une valeur non nulle pour wsCtxt?

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();
  }
Était-ce utile?

La solution

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

Bien que votre nom correct ne soit peut-être pas wsContext. Je suis cette astuce java . Si vous aimez le nom de variable wsCtxt, utilisez l'attribut name dans la déclaration de variable:

  

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

Autres conseils

J'ai toujours ce problème. Voici mon travail consistait à écrire un ServletRequestListener qui place la demande dans une variable ThreadLocal. Ensuite, le WebService peut obtenir la demande du ThreadLocal. En d'autres termes, je réimplémente quelque chose qui ne fonctionne tout simplement pas pour moi.

Voici l'auditeur:

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'encapsuleur 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:

  

demande finale HttpServletRequest =   (HttpServletRequest)   ServletRequestStore.getServletRequest ();

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

Peut-être existe-t-il un conflit entre la prise en charge de WS dans Java 6 et la version de Metro que vous utilisez. Avez-vous essayé sur une version de 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;
}

Peut-être que l'annotation javax.ws.rs.core.Context correspond à ce que vous recherchez, au lieu de Resource?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top