2009-03-02 5 views
9

How can I access the ServletContext from within a JAX-WS web service?과 비슷하게 applicationContext에 쉽게 액세스 할 수 있습니까?JAX-WS 웹 서비스 내에서 ApplicationContext에 어떻게 액세스합니까?

import javax.annotation.Resource; 
import javax.jws.WebService; 
import javax.servlet.ServletContext; 
import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 

import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

@WebService 
public class MyWebService { 
    // boilerplate code begins :(

    @Resource 
    private WebServiceContext context; 
    private WebApplicationContext webApplicationContext = null; 

    /** 
    * @return 
    * @throws IllegalStateException 
    */ 
    private WebApplicationContext getWebApplicationContext() 
      throws IllegalStateException { 
     if (webApplicationContext != null) 
      return webApplicationContext; 
     ServletContext servletContext = 
       (ServletContext) context.getMessageContext().get(
         MessageContext.SERVLET_CONTEXT); 
     webApplicationContext = 
       WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 
     return webApplicationContext; 
    } 
} 

답변

1

에 체인 전에 ServletContext를 저장 필터를 설치합니다. 왜 그걸 알아야하는지 모르겠다. 훨씬 더 수동적이어서는 안 될까요? 필요한 것을 주입하고 그 일을하도록하십시오. 클라이언트와의 서비스 상호 작용은 정의 된 계약을 기반으로해야합니다. 컨텍스트에서 알 수없는 값을 가져와야하는 경우 클라이언트가 설정해야 할 대상이나 설정하는 방법을 클라이언트가 어떻게 알 수 있습니까?

나는 웹 서비스가 스프링 서비스 인터페이스의 래퍼 여야한다고 말했다. 가능한 모든 방법 중에서 하나만 선택하면됩니다. 웹 서비스는 XML 요청/응답 객체를 마샬링 (marshal) 및 언 마샬링 (unmarshal)하고 Spring 서비스와 협력해야합니다.

+0

그렇다면 appContext.getBean ('myBean')을 말할 수 없다면 Spring 서비스와 어떻게 협력 할 수 있을까요? – pihentagy

+0

setter 또는 생성자를 통해 삽입하십시오. 의존성 주입이란 "전화하지 말고 전화 할게." 객체가 필요한 것을 얻기 위해 앱 컨텍스트를 가질 필요는 없습니다. – duffymo

+0

수 없습니다. 글래스 피시에서 웹 서비스를 테스트하면 새 웹 서비스가 만들어지고 구성되지 않습니다. -o이 정보를 얻으려면 하루 정도 걸리는 디버깅이었습니다. ( – pihentagy

0

내가 웹 서비스가 웹 또는 서블릿 컨텍스트 또는 애플리케이션 컨텍스트에 대해 알고 있어야한다고 생각하지 않는다 ThreadLocal을

1

웹 서비스 빈을 스프링 빈으로 확장하십시오.

SpringBeanAutowiringSupport 클래스의 JavaDoc을 따라 this

8
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.web.context.support.SpringBeanAutowiringSupport; 


@WebService( 
    endpointInterface = "Bla", 
    targetNamespace = "http://bla/v001", 
    wsdlLocation = "WEB-INF/wsdl/bla.wsdl",  
    serviceName = "BlaService", 
    portName = "BlaPort") 
public class BlaWs extends SpringBeanAutowiringSupport implements BlaPort { 

    @Autowired 
    @Qualifier("dao") 
    private Dao dao; 
    ... 
} 
+2

+1 'SpringBeanAutowiringSupport'의 방향으로 나를 가리켜 주셔서 감사합니다. 나는 글래스 피쉬를 얻는 데 어려움을 겪고있었습니다. JAX-WS 관리권을 포기하고 Spring에게 맡기면 훨씬 쉬워지고 Spring은 자신이 잘하는 것에 집중할 수 있습니다. –

+0

I 솔루션을 작동 시키려고했지만 SpringBeanAutowiringSupport는 제 웹 서비스에 영향을 미치지 않는 것 같습니다. http://stackoverflow.com/questions/12869014/web-service-exposed-by-extending-springbeanautowiringsupport-is-failing-to-injec – AR3Y35

관련 문제