使用Java Web服务时,如何访问HttpServletRequest对象

使用Java Web服务时,如何访问HttpServletRequest对象,java,web-services,annotations,servlets,Java,Web Services,Annotations,Servlets,我正在使用Java6、Tomcat6和Metro。我使用WebService和WebMethod注释来公开我的web服务。我想获得有关该请求的信息。我尝试了以下代码,但wsCtxt始终为空。我必须采取什么步骤才能使WebServiceContext不为null 换句话说:我如何执行下面的一行来获取wsCtxt的非空值 MessageContext msgCtxt=wsCtxt.getMessageContext() 可能javax.ws.rs.core.Context注释是针对您要查找的内容,而

我正在使用Java6、Tomcat6和Metro。我使用WebService和WebMethod注释来公开我的web服务。我想获得有关该请求的信息。我尝试了以下代码,但wsCtxt始终为空。我必须采取什么步骤才能使WebServiceContext不为null

换句话说:我如何执行下面的一行来获取wsCtxt的非空值

MessageContext msgCtxt=wsCtxt.getMessageContext()


可能javax.ws.rs.core.Context注释是针对您要查找的内容,而不是资源?

我建议您将变量从wsCtxt重命名为wsContext,或者将name属性指定给@Resource注释。指示变量的名称用作查找的一部分。我在Glassfish中使用资源注入时遇到了同样的问题,注入了不同类型的资源

虽然您的正确名称可能不是wsContext。我正在关注这个。如果您喜欢变量名wsCtxt,请在变量声明中使用name属性:

@Resource(name=“wsContext”)WebServiceContext wsCtxt


我仍然有这个问题。我的工作是编写一个ServletRequestListener,将请求放入ThreadLocal变量。然后WebService可以从ThreadLocal变量获取请求。换句话说,我正在重新实现一些对我来说不起作用的东西

下面是听众:

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包装器:

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

}
import javax.servlet.ServletRequest;
公共类ServletRequestStore{
private final static ThreadLocal servletRequests=new ThreadLocal();
公共静态void setServletRequest(ServletRequest请求){
servletRequests.set(请求);
}
公共静态ServletRequest getServletRequest(){
返回servletRequests.get();
}
}
以及web.xml连接:

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

ecb.sdw.webservices.SDMXRequestListener
Web服务使用以下代码获取请求:

最终HttpServletRequest请求= (HttpServletRequest) ServletRequestStore.getServletRequest()


下面的代码适用于使用Java5、Tomcat6和Metro的我

可能是Java 6中的WS-support与您正在使用的Metro版本之间存在冲突。您在Java5构建中试用过吗

@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;
}
@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;
}