在运行时为使用wsimport生成的代码重写或设置Web服务端点
使用wsimport
生成的代码,可以重写服务端点而不必重新生成代码?
我写了一个简单的java web服务,以下是步骤:
- 我编译java类并生成一个war文件
- 将war文件部署到我的应用服务器(tomcat)
- 通过URL访问WSDL,例如localhost:8080 / service / helloservice?wsdl
- 使用带有wsimport.bat的URL来生成客户端类,例如:
wsimport http://localhost:8080/service/helloservice?Wsdl
- 我在我的客户端应用程序中使用这些类来调用服务
问题是服务部署在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();