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

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

解决方案

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

虽然您的正确名称可能不是wsContext。我正在关注 java tip 。如果您喜欢变量名称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<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();

以下代码适用于我使用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注释是针对你要找的而不是资源?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top