2009-09-17 7 views
5

Tomcat에 상태 저장 웹 서비스가 배포되었습니다. 공장 서비스와 기본 API 서비스로 구성되며 잘 작동합니다. 팩토리 서비스는 기본 API 인스턴스에 W3CEndpointReference를 반환하고 클라이언트는 세션을 사용합니다.JAX-WS : 독립 실행 형 프로세스에서 상태 저장 WS가 실패합니다.

이제 독립형 응용 프로그램과 동일한 서비스를 실행하려고합니다. 이 경우 공장에서 반환 한 W3CEndpointReference가 갑자기 기본 URI가 아니라 공장 URI를 가리 키기 시작합니다.

Tomcat 및 독립 실행 형에 대한 참조에서 비교할 때 독립 실행 형 참조가 잘못된 URI를 가지고 있음이 분명해집니다. 특히 기본 API가 아닌 factory URI를 가리 킵니다.

서블릿 컨텍스트에서 일부 코드는 서비스 클래스 간의 일치에 대한 지식을 가지고 나의 이해
<Address>http://localhost:9009/td2ws/factory</Address> 

(Td2Ws :

여기
... 
<ns3:Address>http://localhost:8080/td2ws/api</ns3:Address> 
... 

하는 공장은 독립 프로세스를 참조라고합니다 것 : 여기

는 올바른 참조입니다) 및 그것의 URI, 그리고 그에 따라 참조를 조정합니다. 이 코드는 독립형 프로세스에서는 효과가 없습니다. 심지어 코드가 sun-jaxws.xml을 사용한다고 의심 할 수도 있지만 "켜는"방법을 모르겠습니다.

어떻게 독립형 응용 프로그램 작업에서 상태 기반 웹 서비스를 만들 수 있습니까? (무)

공장 서비스 :

@WebService(targetNamespace="http://server.td2ws.sf.net/") 
public class Td2WsFactory { 
    @WebMethod(operationName="StartSession", action="urn:StartSession") 
    @WebResult(name="Reference") 
    public W3CEndpointReference startSession() { 
     StatefulWebServiceManager<Td2Ws> manager = Td2Ws.getManager(); 

     // for standalone execution only 
     if(manager == null) { 
      manager = new StatefulInstanceResolver<Td2Ws>(Td2Ws.class); 
      Td2Ws.setManager(manager); 
     } 

     Td2Ws session = new Td2Ws(); 
     return manager.export(W3CEndpointReference.class,session); 
    } 
} 

상태 유지 API : (독립 실행 대상)

@Stateful 
@WebService(targetNamespace="http://server.td2ws.sf.net/") 
@Addressing 
public class Td2Ws { 
    private static StatefulWebServiceManager<Td2Ws> manager; 

    public static void setManager(StatefulWebServiceManager<Td2Ws> manager) { 
     Td2Ws.manager = manager; 
    } 

    public static StatefulWebServiceManager<Td2Ws> getManager() { 
     return Td2Ws.manager; 
    } 

    @WebMethod(operationName="Login", action="urn:Login") 
    public void login(
      @WebParam(name="Username") String username, 
      @WebParam(name="Password") String password, 
      @WebParam(name="Domain") String domain, 
      @WebParam(name="Project") String project 
      ) throws Td2WsException { 

클라이언트 코드 :

여기

코드의 관련 부분입니다

public static void main(String[] args) throws Exception { 
    Endpoint epf = Endpoint.publish("http://localhost:9009/td2ws/factory", new net.sf.td2ws.server.Td2WsFactory()); 
    Endpoint eps = Endpoint.publish("http://localhost:9009/td2ws/api", new net.sf.td2ws.server.Td2Ws()); 

    URL factoryUrl = new URL("http://localhost:9009/td2ws/factory?wsdl"); 
    QName factoryQname = new QName("http://server.td2ws.sf.net/", "Td2WsFactoryService"); 

    URL sessionUrl = new URL("http://localhost:9009/td2ws/api?wsdl"); 
    QName sessionQname = new QName("http://server.td2ws.sf.net/", "Td2WsService"); 

    Td2WsFactory factory = new Td2WsFactoryService(factoryUrl,factoryQname).getTd2WsFactoryPort(); 
    System.out.println("factory: "+factory); 

    W3CEndpointReference session = factory.startSession(); 
    System.out.println("session: "+session); 

    Td2WsService service = new Td2WsService(sessionUrl,sessionQname); 
    System.out.println("service: "+service); 

    Td2Ws port = service.getPort(session,Td2Ws.class); 
    System.out.println("port: "+port); 

    port.login(
      Config.get("td.user"), 
      Config.get("td.pass"), 
      Config.get("td.domain"), 
      Config.get("td.project")); 
    System.out.println("logged in..."); 

그 코드는 로그인에 실패() 타겟 객체는 더 로그인 작업 (이 잘못 결국, 공장 URI를 대상 것)이없는 같이

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 
Cannot find dispatch method for {http://server.td2ws.sf.net/}Login 

답변

0

나는 한동안이하지 않은,하지만 난보고했다 몇 시간 전에 만들었던 기능적으로 안정적인 웹 서비스에서 내 클래스의 상단에이를 제외하고는 내 주석이, 당신과 매우 유사합니다

public class MyService { 

    @Resource 
    WebServiceContext wsCtx; 

    ... 

} 

공지 사항에는 수정이 없습니다, 만약 내가 그것을 공개 할 필요가 있다고 생각하지만 난 긍정적 아니에요 아무것도. 컨테이너가 이것을 설정하는 방법은 나를 때리지 만 작동합니다. WebServiceContext 유형의 @Resource를 찾아 설정해야합니다. 다음과 같이 세션 정보에 액세스 할 수 있습니다.

HttpServletRequest hRequest = (HttpServletRequest)ctx.getMessageContext().get(MessageContext.SERVLET_REQUEST); 

Session s = hRequest.getSession(); 
+0

해당 서비스는 독립형, 즉 Servlet 컨테이너 내에서 실행되지 않습니다. –