使用wsimport
生成的代码,是否可以覆盖服务端点而无需重新生成代码?
我写了一个简单的java webservice,以下是步骤:
wsimport http://localhost:8080/service/helloservice?Wsdl
问题是服务部署在8080以外的端口上运行的应用服务器上,客户端和服务之间的通信永远不会发生。我想知道在客户端使用的存根中创建没有服务器和端口硬编码的存根的最佳方法是什么。
答案 0 :(得分:82)
您的客户端可以通过BindingProvider界面在运行时在服务“端口”中设置端点。
考虑this JAX-WS tutorial中的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);
警告:我没有下载教程代码并对其进行了测试。
答案 1 :(得分:0)
我遇到了同样的问题,一旦代码转移到生产环节它就很糟糕了,它总是寻找硬编码的WSDL位置,即Windows C:........等
我已经通过各种帖子和页面找到了答案但是所有都失败了然后通过查看由JAX-WS导入生成的服务类找到了自己的方式。
我必须像我这样在我的调用类中覆盖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();