如何更改Web服务URL端点?


101

我使用Eclipse“来自wsdl的Web服务客户端”,使用JBoss utils(兼容JAX-WS)生成了Web服务客户端。

因此,我提供的唯一内容是Web服务WSDL的URL。

现在,Web服务提供商告诉我更改Web服务的“客户端端点应用程序访问的URL”。

这是什么以及如何更改?


您可以使用带有新URL的相同Eclipse向导重新创建事物吗?
Thilo

告诉Web服务提供商您需要wsdl的新URL,然后将其与Eclipse向导一起使用以重新生成客户机。
systempuntoout 2010年

@Thilo @systemputoout伙计们,问题是他们有相同的WSDL URL!我不确定,但是在我看来,在Axis中可以在调用Web服务时提供URL。在JAX-WS中,您无法更改“运行时客户端端点”。大家有什么想法吗?
EugeneP

1
@ Pascal Thivent,@ systempuntoout引用:“用于客户端应用程序访问的URL或端点”
EugeneP 2010年

1
好吧,我对这句话的理解是“客户端访问服务端点;端点位置已更改”。这是有道理的。
Pascal Thivent

Answers:


174

IMO,提供者告诉您更改服务端点(即访问Web服务的位置),而不是客户端端点(我不知道这可能是什么)。要更改服务端点,您基本上有两个选择。

使用绑定提供程序设置端点URL

第一个选项是更改(每个代理实现接口)的BindingProvider.ENDPOINT_ADDRESS_PROPERTY属性值:BindingProviderjavax.xml.ws.BindingProvider

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

缺点是,这仅在原始WSDL仍可访问时才起作用。不建议。

使用WSDL获取端点URL

第二个选项是从WSDL获取端点URL。

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...

7
我认为第二个代码块中有错误,应该不是URL newEndpoint = new URL(“ WSDL_URL”); 在第一行
Jaime Hablutzel 2012年


12
值得指出的是,现代wsimport工具不再使用某种get[Service]Port方法来生成代码。而是调用get[Service]并将结果对象转换为,BindingProvider以设置这些类型的属性。
Christopher Schultz

感谢wsimport提示上的@ChristopherSchultz!那个def。为我们工作
Cuga

1
据我从cxf生成的存根代码了解,上面的第二个选项更改了wsdl url,而不是服务url。我想念什么吗?
cacert

16

为了在此提供一些说明,在创建服务时,服务类使用默认的“ wsdlLocation”,当从wsdl构建类时将其插入其中。因此,如果您有一个名为SomeService的服务类,并且创建了这样的实例:

SomeService someService = new SomeService();

如果查看SomeService内部,将看到构造函数如下所示:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

因此,如果希望它指向另一个URL,则只需使用带有URL参数的构造函数(也有6个构造函数用于设置qname和功能)。例如,如果您设置了一个在端口9999上侦听的本地TCP / IP监视器,并且您想要重定向到该URL:

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

然后将在服务内部调用此构造函数:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}

2
不必要。我有使用Apache CXF的wsdl2java生成的服务,即使将新的wsdl位置传递给构造函数,它的端口仍会尝试绑定到在编译/生成时设置的位置(别无选择,只能将端口类型转换为BindingProvider和在其请求上下文映射中设置新地址。)
luis.espinal

1
@Luis-很难确切知道您所看到的内容,但是如果进行调试,您应该会看到对javax Provider类的调用,然后看到它尝试使用新的wsdl位置创建端点(假设您正在使用JAX-WS 2.0 +)。然后在您的服务内部,getPort调用应调用super.getPort,该端口使用在serviceDelegate对象中设置的新端口。这就是在JAX-WS 2.0中与javax.xml.ws.Service一起使用的方式。我会在超级调用上设置一个断点,然后从那里进行调查。
MattC'9

0

我不会像@Femi那样更改现有的address属性。您可以轻松地将新服务添加到“定义”部分。

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

这不需要将WSDL重新编译为Java,并且进行更新并不比您使用BindingProvider选项困难(顺便说一句对我来说不起作用)。


-6

要更改结束地址属性,请编辑您的wsdl文件

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

11
在许多情况下,WSDL被强加给您,并且您不应更改它。更重要的是,从一个环境到另一个环境(测试与实时),端点url可能会发生变化。.在这种情况下,没有人愿意调整wsdl并重新编译。
Myobis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.