尝试使用JAX-WS 2.1调用Web服务时出现“ Exception javax.xml.ws.WebServiceException:不支持的端点地址”

Jus*_*tin 5 java web-services jax-ws webservice-client

我正在尝试在此处调用Web服务:http : //publicbetawebservices.hotel.de/V2_8/FreeHotelSearchWebService.svc?WSDL

我已经使用wsimport和JDK1.6.0_29生成了代理类。我的wsimport命令行是:

wsimport.exe" -keep -B-XautoNameResolution -d E:\mapov\mapov-dev\shared\hotel_info\ http://publicbetawebservices.hotel.de/V2_8/FreeHotelSearchWebService.svc?WSDL
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码尝试调用该服务:

QName qName = new QName("http://webservices.hotel.de/V2_8", "FreeHotelSearchWebService");
FreeHotelSearchWebService service = new FreeHotelSearchWebService(new URL("http://publicbetawebservices.hotel.de/V2_8/FreeHotelSearchWebService.svc"), qName);
IFreeHotelSearchWebService sws = service.getBasicHttpBindingIFreeHotelSearchWebService();
String version = sws.getWebservicesVersion();
System.out.println("Hotel.info web service version: " + version);
Run Code Online (Sandbox Code Playgroud)

但是我得到以下异常:

线程“主”中的异常javax.xml.ws.WebServiceException:不支持的端点地址:在com.sun.xml.ws上的com.sun.xml.ws.api.pipe.TransportTubeFactory.create(TransportTubeFactory.java:148)上。 com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:641)的com.sun.xml.ws.api.pipe.Fiber的transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:134) com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)的_doRun(Fiber.java:600)com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber。 com.sun.xml.ws.client.Stub.process(Stub.java:323)处com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)处的java:482) com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)上的.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:113)。xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)在$ Proxy42.getWebservicesVersion(未知源)

在大多数示例中,我已经看到生成的代码包含getPort()方法,但尚未为此类生成此代码。我的代码错误还是我需要以其他方式运行wsimport?我还尝试了调用FreeHotelWebService构造函数而没有产生相同异常的参数。

Zon*_*Zon 6

根据 Justin 和Tug 的博客重新提出一个无答案的问题:

JAX-WS:如何在运行时配置服务端点?

部署 Web 服务客户端时,您经常需要更改在代码生成期间设置的服务端点。这篇简短的文章解释了如何在客户端代码中在运行时设置更改它。

您有两种方法可以做到这一点:

  • 使用 BindingProvider 设置端口中的端点;
  • 在运行时从 WSDL 本身获取端点 URL;

使用 Binding Provider 设置端点 URL

第一种方法是使用以下代码更改 BindingProvider(端口)的 BindingProvider.ENDPOINT_ADDRESS_PROPERTY 属性值:

    try { 
        EmployeeServiceService service = new EmployeeServiceService();

        EmployeeService port = service.getEmployeeServicePort();
        BindingProvider bp = (BindingProvider)port;
        bp.getRequestContext().put(
          BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
           "http://server1.grallandco.com:8282/HumanRessources/EmployeeServiceService");

        Employee emp = port.getEmployee(123);
        System.out.println("Result = "+ emp);
    } catch (Exception ex) {...
       
Run Code Online (Sandbox Code Playgroud)

使用 WSDL 获取端点 URL

另一部分是在创建服务时设置 WSDL。该服务将使用位于 WSDL 端口 -SOAP Endpoint- 中的值。只需使用以下代码即可完成此操作:

    try { 
       EmployeeServiceService service =
         new org.demo.service.EmployeeServiceService(
           new URL(       
             "http://server1.grallandco.com:8282/HumanRessources/" + 
             "EmployeeServiceService?wsdl"), 
           new QName(
             "http://service.demo.org/",
             "EmployeeServiceService"));

        EmployeeService port = service.getEmployeeServicePort();
        Employee emp = port.getEmployee(123);

     System.out.println("Result = "+ emp);
    } catch (Exception ex) {...}
      
Run Code Online (Sandbox Code Playgroud)

请注意,在 Glassfish 中,与许多 Web 服务环境一样,WSDL 可以根据用于获取 WSDL 的 URL 动态生成端点 URL。通过这种方法,您还可以动态更改 Soap 端点(如果与生产环境的网络配置兼容)。