2009-12-25 2 views
0

은 단순히 서블릿 고려 :서블릿을 웹 서비스에 이식 - 컨텍스트에 액세스 하시겠습니까?

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

을 그리고 유틸리티 클래스는 파일과 함께 무언가를 : 지금 톰캣과 Axis2를에서 실행되는 웹 서비스에 doSomething() 기능을 포팅하고

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

. 컨텍스트에 액세스하여 서블릿 아래의 파일에 액세스 할 수 있도록 이식하는 방법은 무엇입니까?

+0

나는 Axis를 사용하지 않기 때문에 정확한 답을 줄 수는 없지만 적어도 서블릿 컨텍스트 외부에서 ServletContext를 전달해서는 안된다. 가능하다면 파일 경로 (또는 아마도'File' 또는'InputStream')를 웹 서비스에 전달하십시오. – BalusC

+0

'File '은 웹 서비스에 대한 유효한 매개 변수가 아닙니다. –

답변

2

귀하의 (jax-ws) MessageContext을 받으십시오. 이 구성에 따라, 그러나 아마

@Resource 
private WebServiceContext wsCtx; 

를 사용하고 방법 것 :

MessageContext messageContext = wsCtx.getMessageContext() 

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

편집 :

HttpServlet servlet = (HttpServlet) 
    MessageContext.getCurrentContext().getProperty(HTTPConstants.MC_HTTP_SERVLET); 
ServletContext ctx = servlet.getServletContext(); 
: Axis2를 (뿐만 아니라 축)처럼 보인다 다음을 지원

다음 수입품을 포함합니다 :

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

은 좋은 생각처럼 들리지만, 나는 null wsCtx를 얻고있다. 왜 그런가? –

+0

은 이름을'wsContext'로 변경하고'private'을 제거하려고 시도했습니다. - 주사위 없음 ... –

+0

흠. 내 소식을 업데이트했습니다. – Bozho

0

서블릿 FilterThreadLocal과 같은 소리입니다. Axis는 서블릿 컨텍스트 내에서 실행 중이다. 따라서 사용자 정의 javax.servlet.Filter을 구현하여 ServletRequestThreadLocal으로 채우고 유틸리티 클래스에서 액세스 할 수 있습니다. FilterConfig에서 ServletContext을 얻을 수 있습니다.

+0

SOME_FILE이 비즈니스 매개 변수가 아닌 웹 서비스 내부의 일부라고 가정합니다. – mhaller

+0

그 해결책은 효과가 있지만 이미 웹 서비스 스택에 의해 구현됩니다. – Bozho

+0

ServletContext 나 ​​WebServiceContext를 직접 사용하는 문제는 유틸리티 클래스 내에서 종속성을 갖게된다는 것입니다. 자신의 ThreadLocal에서 이러한 정보를 채우고 필터/리스너가 dep-mgmt 관점에서 더 깨끗하게 처리하도록하십시오. 하지만 당신이 맞다. 이미 사용하고 있다면 그것을 사용하고 바퀴를 재발 명하지 말자 :-) – mhaller