Java 如何更改webservice url端点?

Java 如何更改webservice url端点?,java,web-services,jboss,jax-ws,Java,Web Services,Jboss,Jax Ws,我使用JBoss utils(JAX-WS兼容)生成了一个web服务客户端 使用Eclipse“来自wsdl的web服务客户端” 所以,我只提供了一个指向web服务WSDL的url 现在,web服务提供者告诉我更改web服务的“客户端端点应用程序访问url” 它是什么以及如何更改它?在我看来,提供商告诉您要更改服务端点(即web服务的访问位置),而不是客户端端点(我不明白这可能是什么)。要更改服务端点,基本上有两种选择 使用绑定提供程序设置端点URL 第一个选项是更改BindingProvide

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

所以,我只提供了一个指向web服务WSDL的url

现在,web服务提供者告诉我更改web服务的“客户端端点应用程序访问url”


它是什么以及如何更改它?

在我看来,提供商告诉您要更改服务端点(即web服务的访问位置),而不是客户端端点(我不明白这可能是什么)。要更改服务端点,基本上有两种选择

使用绑定提供程序设置端点URL 第一个选项是更改
BindingProvider
BindingProvider.ENDPOINT\u ADDRESS\u属性值(每个代理实现
javax.xml.ws.BindingProvider
接口):

缺点是,只有当原始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]));
...

要更改EndAddress属性,请编辑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>

要在这里添加一些说明,当您创建服务时,服务类使用默认的“wsdlLocation”,它是在从wsdl构建类时插入的。因此,如果您有一个名为SomeService的服务类,并创建如下实例:

SomeService someService = new SomeService();
public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}
如果查看某个服务内部,您将看到构造函数如下所示:

SomeService someService = new 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);
}

我甚至不想@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选项(顺便说一句,这对我不起作用)更困难。

您可以使用相同的Eclipse向导和新的URL重新创建这个东西吗?告诉web服务提供商您需要WSDL的新URL,然后将其与Eclipse向导一起使用以重新生成客户端。@Thilo@systemputoout伙计们,问题是它们具有相同的WSDL URL!!我不确定,但在我看来,在Axis中,您可以在调用web服务时提供URL。在JAX-WS中,不能更改“运行时客户端端点”。有什么想法吗,伙计们?@Pascal Thivent,@systempuntoout引用:“客户端应用程序访问的URL或端点”我对这句话的理解是“客户端访问服务端点;端点位置已更改”。这是有道理的。我认为第二个代码块中有一个错误,不应该是URL newEndpoint=newurl(“WSDL_URL”);在第一行??这里是一个教程链接,值得指出的是,现代
wsimport
工具不再使用
get[Service]Port
方法生成代码。相反,请调用
get[Service]
并将结果对象强制转换为
BindingProvider
,以设置这些类型的属性。感谢wsimport技巧中的@ChristopherSchultz!那是def。据我从cxf生成的存根代码中了解,上面的第二个选项更改了wsdl url,而不是服务url。我遗漏了什么吗?在许多情况下,WSDL是强加给您的,您不应该更改它。更重要的是,从一个环境到另一个环境(测试vs live),端点url可能会发生更改。。在这种情况下,没有人愿意调整wsdl并重新编译。不一定。我使用Apache CXF的wsdl2java生成了服务,即使我们将新的wsdl位置传递给构造函数,它的端口仍会尝试绑定到编译/生成时设置的位置(没有留下任何选择,只能将端口类型转换为BindingProvider,并在其请求上下文映射中设置新地址)@Luis—很难确切知道您看到了什么,但是如果进行调试,您应该看到对javax提供者类的调用,然后看到它尝试使用新的wsdl位置创建端点(假设您使用的是JAX-WS 2.0+)。然后在您的服务内部,getPort调用应该调用super.getPort,它使用在serviceDelegate对象中设置了您的新端口。这就是JAX-WS2.0中javax.xml.ws.Service的工作方式。我会在超级调用上设置一个断点,并从那里进行调查。@MattC-即使我们动态更改URL,我们添加到项目中的WSDL URL是否总是需要可访问的?你能分享一下你的行为吗?