JAX-WS ::从独立的Java 7 SE客户端调用Web服务的方法

我正在尝试独立的JAX-WS Web服务,服务器和客户端(意思是,不在Java EE容器内运行)。 显示独立服务器端的好SOpost就是这个 。

对于客户端,我发现了以下三种似乎有效的方法(使用wsimport生成客户端存根):

 public static void main(String[] args) throws Exception { String serviceURL = "http://localhost:9000/soap?wsdl"; { // WAY 1 URL url = new URL(serviceURL); QName qname = new QName("urn:playground:jax-ws", "MyService"); Service service = Service.create(url, qname); IHello port = service.getPort(IHello.class); System.out.println(port.sayHello("Long John")); } { // WAY 2 MyService service = new MyService(); IHello port = service.getHelloPort(); ((javax.xml.ws.BindingProvider) port).getRequestContext().put(javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceURL); System.out.println(port.sayHello("Long John")); } { // WAY 3 URL url = new URL(serviceURL); QName qname = new QName("urn:playground:jax-ws", "MyService"); MyService service = new MyService(url, qname); IHello port = service.getHelloPort(); System.out.println(port.sayHello("Long John")); } } 

我不知道客户端访问的任何其他模式或上面显示的方式如何相互比较。

应该注意的任何其他方法或权衡取舍?

最后,经过一些实验,我认为下面显示的方式(从这里开始 )与我之前的三个问题相比具有明显的优势:

 { // WAY 4 QName qname = new QName("urn:playground:jax-ws", "MyService"); MyService service = new MyService(null, qname); IHello port = service.getHelloPort(); BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serviceURL); System.out.println(port.sayHello("John Silver")); } 

优点是:

  • WSDL 不是在运行时检索的(为什么它应该是?它已经在代码创建时用于创建客户端存根)
  • 服务的URL 在存根中进行硬编码。