2009-09-17 27 views
5

Tôi có một dịch vụ web trạng thái được triển khai trên Tomcat. Nó bao gồm dịch vụ nhà máy và dịch vụ API chính, và hoạt động tốt. Dịch vụ nhà máy trả về một W3CEndpointReference cho cá thể API chính và máy khách sử dụng phiên làm việc đó.JAX-WS: WS trạng thái không thành công trong một quy trình độc lập

Bây giờ, tôi đang cố chạy dịch vụ giống như một ứng dụng độc lập. Trong trường hợp này, W3CEndpointReference được trả về bởi nhà máy đột nhiên bắt đầu trỏ tới URI của nhà máy, không phải đến dịch vụ chính.

Khi tham chiếu từ chạy với Tomcat và độc lập được so sánh, rõ ràng là tham chiếu độc lập có URI sai. Cụ thể, nó trỏ đến URI của nhà máy chứ không chỉ API chính.

Dưới đây là đúng tài liệu tham khảo:

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

Dưới đây là tài liệu tham khảo khi nhà máy được gọi vào quá trình độc lập:

<Address>http://localhost:9009/td2ws/factory</Address> 

hiểu biết của tôi rằng một số mã dưới bối cảnh servlet có một kiến ​​thức tương ứng giữa lớp dịch vụ (Td2Ws) và đó là URI và điều chỉnh các tham chiếu cho phù hợp. Đoạn mã đó không có hiệu lực theo quy trình độc lập. Tôi thậm chí có thể nghi ngờ rằng mã sử dụng sun-jaxws.xml, nhưng tôi không biết làm thế nào để "bật nó lên".

Làm cách nào để tạo dịch vụ web trạng thái trong ứng dụng độc lập?

Dưới đây là phần có liên quan của mã:

dịch vụ Nhà máy (stateless):

@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); 
    } 
} 

Stateful 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 { 

Khách hàng mã (nhắm mục tiêu đến độc):

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..."); 

Đó là mã không thành công trên đăng nhập() là đối tượng mục tiêu không có hoạt động Đăng nhập (nó sai nhắm mục tiêu đến nhà máy URI, sau khi tất cả):

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

Trả lời

0

tôi đã không làm điều này trong một thời gian, nhưng tôi đã xem tại một dịch vụ web đầy đủ chức năng mà tôi đã xây dựng một thời gian trước đây. Chú thích của tôi là rất giống như của bạn, ngoại trừ tôi có điều này ở phía trên cùng của lớp học của tôi:

public class MyService { 

    @Resource 
    WebServiceContext wsCtx; 

    ... 

} 

Thông báo không có sửa đổi, nếu bất cứ điều gì khác tôi nghĩ rằng nó cần phải được công khai, nhưng tôi không tích cực. Làm thế nào các container biết để thiết lập này nhịp đập tôi, nhưng nó hoạt động. Nó chỉ cần tìm bất kỳ @Resource loại WebServiceContext nào và thiết lập nó. Bạn có thể truy cập thông tin phiên như vậy:

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

Session s = hRequest.getSession(); 
+0

Dịch vụ được đề cập độc lập, tức là không chạy trong vùng chứa Servlet. –

Các vấn đề liên quan