【问题标题】:Porting a servlet to a web service - accessing the context?将 servlet 移植到 Web 服务 - 访问上下文?
【发布时间】:2009-12-25 21:00:46
【问题描述】:

考虑一个简单的 servlet:

// MyServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
    UtilClass.doSomething(getServletContext().getRealPath(SOME_FILE));
}

实用程序类对文件做了一些事情:

// UtilClass.java
public String doSomething(String filePath)
{
    File f = new File(filePath);
    String s = readWhateverFrom(f);
    return s;
}

我现在将doSomething() 函数移植到在Tomcat 和Axis2 下运行的Web 服务。我将如何移植它以便我仍然可以访问上下文并访问 servlet 下的文件?

【问题讨论】:

  • 我不能给出确切的答案,因为我不做 Axis,但我至少可以告诉你真的不应该在 servlet 上下文之外传递ServletContext。如果可以,不如将文件路径(或者可能是 FileInputStream)传递给 Web 服务。
  • File 不是 Web 服务的有效参数

标签: java web-services tomcat axis


【解决方案1】:

你应该得到你的 (jax-ws) MessageContext。这取决于您的配置,但可能使用

@Resource
private WebServiceContext wsCtx;

在你的方法中:

MessageContext messageContext = wsCtx.getMessageContext()

ServletContext ctx = (ServletContext) 
           messageContext.getProperty(MessageContext.SERVLET_CONTEXT);

编辑:似乎 Axis2(以及 Axis)支持以下内容:

HttpServlet servlet = (HttpServlet) 
    MessageContext.getCurrentContext().getProperty(HTTPConstants.MC_HTTP_SERVLET);
ServletContext ctx = servlet.getServletContext();

使用以下导入:

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;

【讨论】:

  • 听起来是个好主意——但我得到的是一个空的wsCtx。知道为什么吗?
【解决方案2】:

听起来像是 Servlet FilterThreadLocal 的工作。 Axis 也在 Servlet 上下文中运行。所以你所要做的就是实现一个自定义的javax.servlet.Filter,将ServletRequest 填充到ThreadLocal 中,你可以从你的实用程序类中访问它。您可以从FilterConfig 获取ServletContext

【讨论】:

  • 我假设 SOME_FILE 是 Web 服务内部的一部分,而不是业务参数的一部分。
  • 该解决方案可行,但它已由 Web 服务堆栈实现。
  • 直接使用 ServletContext 或 WebServiceContext 的问题在于,您将在实用程序类中依赖它们——您肯定不希望拥有它们。从 dep-mgmt 的角度来看,在您自己的 ThreadLocal 中填充此类信息并让过滤器/侦听器这样做更干净。但你是对的,如果它已经存在,那就使用它,不要重新发明轮子 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多