一、最近看到项目中有关webService的使用,特意去了解了一下。这里只记录如何使用idea创建,关于webService的其他知识,可以查看其他博客进行了解。
1、使用idea创建webService服务端。
新建项目:
1.1、选择1.8之前的jdk版本。1.8的jdk有一个bug。度娘了一下:在 1.8jre/lib 下新建 jaxp.properties。内容如下:
javax.xml.accessExternalSchema = all
如上图设置,点击next。
1.2、项目名任意,点击finish
等待下载相关的lib,服务端就完成了,如下图:启动main就可以启动服务端了。
下面我把代码以及配置文件粘贴出来: 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。用于存放客户端代码。
然后启动服务端,也就是HelloWorld.java中的main函数。(必须启动要不无法根据wsdl创建客户端)
创建客户端有几种方法。1.使用idea直接创建。2.使用jdk自带的wsimport命令创建。
1.使用idea直接创建。
右击client目录如下图:
右击client---选择WebService--Generate Java Code From Wsdl....如下图:
只需要把,服务端的的wsdl url复制到Web service wsdl url上即可。点击ok。
到此,客户端就完成了。
3、下面我们进行测试。
在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看看无服务端是否接受到请求。
服务端控制台输出:Hello, world, from test
说明服务端成功接受到请求。
最后补充使用jdk自带的wsimport命令生成客户端:首先把之前的client下的内容全部删掉,如下图:
最后把client文件目录也删除掉。然后切换到ideaterminal,切换到下图目录:
输入命令(点击回车即可生成客户端):
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
2.3测试同上。
注意事项:如果你把客户端文件拷到其他目录需要调整客户端接口方法中的calssName
否则报错:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
两个类具有相同的 XML 类型名称 "{http://example/}sayHelloWorldFrom"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。
先到这里,后面有时间再补充cxf+spring+webService。