java - 如何更改webservice url端点?





web-services jboss jax-ws (4)


国际海事组织,提供者告诉你改变服务端点(即到达Web服务的位置),而不是客户端端点(我不明白这可能是什么)。 要更改服务端点,基本上有两个选项。

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

第一个选项是更改BindingProvider.ENDPOINT_ADDRESS_PROPERTY属性值(每个代理实现javax.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]));
...

我使用JBoss utils(JAX-WS compatible)使用Eclipse的Web服务客户端从wsdl生成了一个Web服务客户端。

所以,我提供的唯一东西就是一个到Web服务WSDL的URL。

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

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




要更改结束地址属性,请编辑您的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构建类时,该默认'wsdlLocation'被插入到其中。 所以如果你有一个名为SomeService的服务类,并且你创建了一个这样的实例:

SomeService someService = new SomeService();

如果你看看SomeService,你会看到构造函数如下所示:

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

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

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

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

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



请原谅我的挑剔,但大多数建议的解决方案,即min + rng.nextInt(max - min + 1)) ,由于以下事实似乎很危险:

  • rng.nextInt(n)无法达到Integer.MAX_VALUE
  • min为负时, (max - min)可能导致溢出。

一个万无一失的解决方案将为[ Integer.MIN_VALUEInteger.MAX_VALUE ]中的任何min <= max返回正确的结果。 考虑以下天真的实现:

int nextIntInRange(int min, int max, Random rng) {
   if (min > max) {
      throw new IllegalArgumentException("Cannot draw random int from invalid range [" + min + ", " + max + "].");
   }
   int diff = max - min;
   if (diff >= 0 && diff != Integer.MAX_VALUE) {
      return (min + rng.nextInt(diff + 1));
   }
   int i;
   do {
      i = rng.nextInt();
   } while (i < min || i > max);
   return i;
}

虽然效率低下,但请注意while循环中成功的概率始终为50%或更高。





java web-services jboss jax-ws