一、最近看到项目中有关webService的使用,特意去了解了一下。这里只记录如何使用idea创建,关于webService的其他知识,可以查看其他博客进行了解。

1、使用idea创建webService服务端。

新建项目:

1.1、选择1.8之前的jdk版本。1.8的jdk有一个bug。度娘了一下:在 1.8jre/lib 下新建  jaxp.properties。内容如下:

javax.xml.accessExternalSchema = all

 

idea 新建微服务项目 idea创建webservice_服务端

如上图设置,点击next。

1.2、项目名任意,点击finish

idea 新建微服务项目 idea创建webservice_idea 新建微服务项目_02

等待下载相关的lib,服务端就完成了,如下图:启动main就可以启动服务端了。

idea 新建微服务项目 idea创建webservice_java_03


下面我把代码以及配置文件粘贴出来: HelloWorld.java


package example;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService()
public class HelloWorld {
  @WebMethod
  public String sayHelloWorldFrom(String from) {
    String result = "Hello, world, from " + from;
    System.out.println(result);
    return result;
  }
  public static void main(String[] argv) {
    Object implementor = new HelloWorld ();
    String address = "http://localhost:9000/HelloWorld";
    Endpoint.publish(address, implementor);
  }
}

web.xlm

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
        <description>JAX-WS endpoint</description>
        <display-name>WSServlet</display-name>
        <servlet-name>WSServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>WSServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>

    <endpoint
            name='HelloWorld'
            implementation='example.HelloWorld'
            url-pattern='/services/HelloWorld'/>
</endpoints>

以上就算是服务端的完整代码以及设置。

2、创建客户端。其实有了idea的帮助也很简单。

2.1、我们在项目中新建一个package,命名为client。用于存放客户端代码。

idea 新建微服务项目 idea创建webservice_服务端_04

然后启动服务端,也就是HelloWorld.java中的main函数。(必须启动要不无法根据wsdl创建客户端)

创建客户端有几种方法。1.使用idea直接创建。2.使用jdk自带的wsimport命令创建。

1.使用idea直接创建。

右击client目录如下图:

idea 新建微服务项目 idea创建webservice_java_05

右击client---选择WebService--Generate Java Code From Wsdl....如下图:

idea 新建微服务项目 idea创建webservice_java_06

只需要把,服务端的的wsdl url复制到Web service wsdl url上即可。点击ok。

idea 新建微服务项目 idea创建webservice_idea 新建微服务项目_07

到此,客户端就完成了。

3、下面我们进行测试。

idea 新建微服务项目 idea创建webservice_xml_08

 在src下新建一个package,test进行测试。创建TestWS.java如下:

package test;

import client.HelloWorldService;

public class TestWS {
    public static void main(String[] args) {
        String s = new HelloWorldService().getHelloWorldPort().sayHelloWorldFrom("test");
    }
}

创建服务视图--服务端点--调用服务方法。我们传递了一个参数哦  'test'。

启动TestWS中的main看看无服务端是否接受到请求。

idea 新建微服务项目 idea创建webservice_java_09

服务端控制台输出:Hello, world, from test

说明服务端成功接受到请求。

最后补充使用jdk自带的wsimport命令生成客户端:首先把之前的client下的内容全部删掉,如下图:

idea 新建微服务项目 idea创建webservice_idea 新建微服务项目_10

 最后把client文件目录也删除掉。然后切换到ideaterminal,切换到下图目录:

idea 新建微服务项目 idea创建webservice_服务端_11

输入命令(点击回车即可生成客户端):

wsimport -keep -s . -p client  http://localhost:9000/HelloWorld?wsdl

-keep:是否生成java源文件

-d:指定.class文件的输出目录

-s:指定.java文件的输出目录

-p:定义生成类的包名,不定义的话有默认包名

-verbose:在控制台显示输出信息

-b:指定jaxws/jaxb绑定文件或额外的schemas

-extension:使用扩展来支持SOAP1.2

idea 新建微服务项目 idea创建webservice_java_12

2.3测试同上。

idea 新建微服务项目 idea创建webservice_idea 新建微服务项目_13

注意事项:如果你把客户端文件拷到其他目录需要调整客户端接口方法中的calssName

idea 新建微服务项目 idea创建webservice_java_14

否则报错:

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
两个类具有相同的 XML 类型名称 "{http://example/}sayHelloWorldFrom"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

先到这里,后面有时间再补充cxf+spring+webService。