如何更改webservice url端点?

Eug*_*neP 98 java jboss web-services jax-ws

我使用来自wsdl'的Eclipse'Web服务客户端,使用JBoss utils(JAX-WS兼容)生成了一个Web服务客户端.

所以,我提供的唯一内容是Web服务WSDL的URL.

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

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

Pas*_*ent 165

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]));
...
Run Code Online (Sandbox Code Playgroud)

缺点是这仅在原始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]));
...
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,现代的`wsimport`工具不再使用`get [Service] Port`方法生成代码.相反,调用`get [Service]`并将结果对象强制转换为`BindingProvider`来设置这些属性. (10认同)
  • 我认为第二个代码块中存在错误,不应该是URL newEndpoint = new URL("WSDL_URL"); 在第一行? (7认同)
  • 这是教程的链接http://tugdualgrall.blogspot.com/2009/02/jax-ws-how-to-configure-service-end_17.html (2认同)
  • 据我从 cxf 生成的存根代码中了解到,上面的第二个选项更改了 wsdl url,而不是服务 url。我错过了什么吗? (2认同)

Mat*_*ttC 16

为了在这里添加一些说明,当您创建服务时,服务类使用默认的'wsdlLocation',当从wsdl构建类时,它会插入到它中.因此,如果您有一个名为SomeService的服务类,并且您创建了这样的实例:

SomeService someService = new SomeService();
Run Code Online (Sandbox Code Playgroud)

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

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}
Run Code Online (Sandbox Code Playgroud)

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

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);
Run Code Online (Sandbox Code Playgroud)

这将在服务中调用此构造函数:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
Run Code Online (Sandbox Code Playgroud)

  • 不必要.我有使用Apache CXF的wsdl2java生成的服务,即使我们将新的wsdl位置传递给构造函数,它的端口仍然会尝试绑定到编译/生成时设置的位置(不要做任何选择,只能将端口强制转换为BindingProvider和在请求上下文映射中设置新地址.) (2认同)