2008-09-25 54 views
13

我正在使用Java 6,Tomcat 6和Metro。我使用WebService和WebMethod注释来公开我的Web服务。我想获得有关请求的信息。我尝试了下面的代码,但wsCtxt始终为空。我必须采取什么措施才能使不为为WebServiceContext获取空值。如何在使用Java Web服务时访问HttpServletRequest对象

换句话说:我怎样才能执行以下行来获取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(); 
    } 

回答

10

我建议您将wsCtxt的变量重命名为wsContext或将name属性赋值给@Resource注解。 J2ee tutorial on @Resource指示变量的名称用作查找的一部分。我在Glassfish注入不同类型的资源时遇到了同样的问题。

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

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

1

也许javax.ws.rs.core.Context注释符合您的要求,而不是Resource?

3

我还是有这个问题。这里是我的解决方法是编写一个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(); 
    } 

} 

而且在web.xml接线:

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

Web服务使用下面的代码来获得要求:

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

3

下面的代码工作我使用Java 5,Tomcat的6和地铁

它可能是有Java 6中的WS支持,您使用的是地铁的版本之间有冲突的。你是否在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; 
}