Портирование сервлета в веб-сервис - доступ к контексту? - PullRequest
0 голосов
/ 26 декабря 2009

Рассмотрим просто сервлет:

// 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 . Как бы я перенести его так, чтобы я все еще мог получить доступ к контексту и получить доступ к файлу в сервлете?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2009

Вы должны получить свои (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;
0 голосов
/ 26 декабря 2009

Звучит как работа для сервлета Filter и ThreadLocal. Axis также работает в контексте сервлета. Поэтому все, что вам нужно сделать, это реализовать пользовательский javax.servlet.Filter, вставив ServletRequest в ThreadLocal, где вы можете получить к нему доступ из своего служебного класса. Вы можете получить ServletContext из FilterConfig.

...