如何在使用Java Web Services时访问HttpServletRequest对象

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

换句话说:如何执行以下行来获取wsCtxt的非null值?

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

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

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

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

我还有这个问题。 这是我的解决方法是编写一个ServletRequestListener,将请求放入ThreadLocal var中。 然后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 servletRequests = new ThreadLocal(); public static void setServletRequest(ServletRequest request) { servletRequests.set(request); } public static ServletRequest getServletRequest() { return servletRequests.get(); } } 

和web.xml接线:

   ecb.sdw.webservices.SDMXRequestListener  

Web服务使用以下代码来获取请求:

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

以下代码适用于我使用Java 5,Tomcat 6和Metro

可能是Java 6中的WS支持与您正在使用的Metro版本之间存在冲突。 您是否在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; } 

也许javax.ws.rs.core.Context注释是针对你要找的,而不是资源?