如何解决“异常javax.xml.ws.WebServiceException:不支持的端点地址”尝试使用JAX-WS 2.1调用Web服务?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (1602)

我正在尝试在这里调用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

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

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

但是我得到以下异常:

线程“main”中的异常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的com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:641)上的transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:134)。 _doRun(Fiber.java:600)位于com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:585)的com.sun.xml.ws.api.pipe.Fiber.runSync(光纤。 java:482)com.sun.xml.ws.client.Stub.process(Stub.java:323)at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:161)at com .sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:113)位于com.sun的com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)。$ proxy42.getWebservicesVersion(未知来源)的xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)

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

提问于
用户回答回答于

基于Justin和Tug博客重新提出一个无可挑剔的问题:

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

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

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

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

使用Binding Provider设置端点URL

第一种方法是使用以下代码更改BindingProvider(Port)的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) {...

使用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) {

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

扫码关注云+社区

领取腾讯云代金券