如何更改 Web 服务 url 终结点?

2022-08-31 09:36:54

我使用JBoss utils(JAX-WS兼容)使用Eclipse'web service client from a wsdl'生成了一个Web服务客户端。

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

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

它是什么,如何改变它?


答案 1

IMO,提供商告诉您更改服务端点(即到达Web服务的位置),而不是客户端端点(我不明白这可能是什么)。若要更改服务终结点,基本上有两个选项。

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

第一个选项是更改 的属性值(每个代理都实现接口):BindingProvider.ENDPOINT_ADDRESS_PROPERTYBindingProviderjavax.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]));
...

答案 2

为了在此处添加一些说明,在创建服务时,服务类使用默认的“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);
}

推荐