15

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

换句话说:如何执行以下行来获取 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();
  }
4

4 回答 4

12

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

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

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

于 2008-09-25T14:10:29.050 回答
4

以下代码适用于我使用 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;
}
于 2008-09-26T13:50:10.030 回答
3

我仍然有这个问题。这是我的解决方法是编写一个 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<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 服务使用以下代码获取请求:

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

于 2008-09-26T12:37:06.603 回答
1

也许 javax.ws.rs.core.Context 注释是你正在寻找的,而不是资源?

于 2008-09-25T14:06:15.673 回答