在运行时为使用wsimport生成的代码重写或设置Web服务端点

使用wsimport生成的代码,可以重写服务端点而不必重新生成代码?

我写了一个简单的java web服务,以下是步骤:

  1. 我编译java类并生成一个war文件
  2. 将war文件部署到我的应用服务器(tomcat)
  3. 通过URL访问WSDL,例如localhost:8080 / service / helloservice?wsdl
  4. 使用带有wsimport.bat的URL来生成客户端类,例如: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. 我在我的客户端应用程序中使用这些类来调用服务

问题是服务部署在8080以外的端口上运行的应用服务器上,客户端和服务器之间的通信从未发生过。 我想知道什么是最好的方式来创build没有服务器和端口硬编码客户端使用的存根(stub)中的存根(stub)。

您的客户端可以通过BindingProvider接口在运行时在服务“端口”中设置端点 。

考虑这个JAX-WS教程中的JAX-WS客户端。 编写这个代码的另一种方法是:

 HelloService service = new HelloService(); Hello port = service.getHelloPort(); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://foo:8086/HelloWhatever"); String response = port.sayHello(name); 

警告:我没有下载教程代码,并testing了这个代码。

我遇到了同样的问题,一旦代码转移到生产环境,它总是寻找硬编码的WSDL位置,例如Windows C:…….. etc

我已经通过各种post和页面find答案,但都失败了,然后通过查看由JAX-WS导入生成的服务类来find自己的方式。

我必须像这样在我的调用类中重写JAX-WS WSDL位置实现。

 URL baseUrl; URL wsdlURL = null; baseUrl = <your Services>.class.getResource("."); try { wsdlURL = new URL(baseUrl, "http://<your path>?wsdl"); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } <your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>")); System.out.println(Services.getWSDLDocumentLocation()); YourInterface YourInterfacePort = yourServices.getServicePort(); BindingProvider bindingProvider = (BindingProvider)YourInterfacePort; bindingProvider.getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); 

YourInterfacePort.methods();