【问题标题】:How can I get access to the HttpServletRequest object when using Java Web Services使用 Java Web 服务时如何访问 HttpServletRequest 对象
【发布时间】:2010-09-13 02:28:51
【问题描述】:

我正在使用 Java 6、Tomcat 6 和 Metro。我使用 WebService 和 WebMethod 注释来公开我的 Web 服务。我想获得有关请求的信息。我尝试了以下代码,但 wsCtxt 始终为空。我必须采取什么步骤为 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();
  }

【问题讨论】:

    标签: java web-services annotations servlets


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      以下代码适用于我使用 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;
      }
      

      【讨论】:

        【解决方案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 请求 = (HttpServlet请求) ServletRequestStore.getServletRequest();

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2011-12-13
            • 2013-04-23
            • 1970-01-01
            • 2020-09-01
            • 2015-07-09
            • 2014-03-23
            • 2012-04-03
            • 1970-01-01
            • 2023-04-01
            相关资源
            最近更新 更多