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

时间:2013-09-20 21:07:22

标签: java jax-ws

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

对于客户端,我发现以下三种似乎有效的方法(使用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"));
    }
}

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

应该注意哪些其他方法或权衡?

1 个答案:

答案 0 :(得分:4)

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

{   // 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在运行时检索(为什么它应该是?它已经在代码创建时用于创建客户端存根)
  • 服务的网址是 在存根中进行硬编码。