WebService里的wsdl的详解以及使用注解修改wsdl的配置

来源:互联网 发布:优雅的女生知乎 编辑:程序博客网 时间:2024/05/21 02:32

WebService系列文章: 
【WebService】带你走进webservice的世界 
【WebService】自定义WebService服务及其调用 
【WebService】CXF处理javaBean等复合类型以及Map等复杂类型的数据 
【WebService】CXF拦截器的设置以及自定义CXF拦截器

  前面分析了一下关于ws的基本知识,我们知道,wsdl是ws中很重要的文档,我们可以通过解析该wsdl文档获取ws的相关信息,其实,如果不了解该文档结构的话,问题也不大,只要会解析即可进行开发。但是如果想要生成一个符合自己项目的,或者比较人性化的一个wsdl的话,或者从可读性角度来说,就需要在编写ws代码时进行一些相应的配置了,比如说ws名称,参数等等,那么就需要对wsdl文档有一定的了解。这篇文章主要从两个角度来展开:一是解释一下wsdl中的相关配置,二是如何在ws程序中通过注解指定这些配置。

1. wsdl配置详解

要生成wsdl,首先得有一个ws,我们还是使用前面文章中提到的那个简单的ws,如下:

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebService</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//默认静态方法是不能发不成ws服务的</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MyWebService</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">sayHello</span>(String name) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> name + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" 你好!"</span>;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {        String address = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://192.168.10.1:6666/ws"</span>;        Endpoint.publish(address, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> MyWebService());        System.out.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"访问WSDL的地址为:"</span> + address + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"?WSDL"</span>);    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

  运行一下,即可开启ws服务,请求http://192.168.10.1:6666/ws?WSDL即可看到wsdl页面,接下来分析一下该wsdl文件中与上面程序中的对应关系,看下图(为了清晰的展示,图我就不缩小了): 
这里写图片描述
  我们可以看到,生成的ws服务名称是在原来的类后面有加了个Service而已,服务类型名是在原来的类后面加了个Port,包括参数默认为arg0,返回值为return 等等,这些都能从wsdl文件中看的出来,通过这个wsdl生成的java代码中的类名自然也就是默认的了,如果我们想要修改这些默认的配置,则需要在编写ws的时候通过注解来设置一下。

2. 使用注解修改wsdl配置

我们修改一下上面的ws,使用注解来配置我们自己需要的名称,如下

<code class="language-java hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* *  自定义ws服务, jdk1.6版本仅仅支持 soap1.1格式,jdk1.7及以上版本支持 soap1.2格式 *  发布ws服务只需要@WebService注解即可, 如果想要更好的可维护性,则可以通过注解来实现 * */</span><span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebService</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默认静态的方式是不能发布ws服务的</span>(        name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"MyWebService1"</span>,  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 服务实现类的名称</span>        serviceName=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"MyWebServiceService1"</span>,  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默认在发布的服务实现者的名称后面添加Service</span>        portName=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"MyWebServicePort1"</span>,   <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 服务类型的名称: 默认在 发布的服务实现者(MyWebService) 后面添加 port</span>        targetNamespace=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ws.client.test"</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 发布ws服务的命名空间,此空间默认为当前服务包路径的 "倒写"此名称也是 wsimport 命令生成 java类时默认的包路径 -p</span>)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MyWebService</span> {</span>    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebMethod</span>(exclude=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>)  <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 默认public方法可以发布为ws服务, 如果要排除则配置  exclude=true</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> String <span class="hljs-title" style="box-sizing: border-box;">sayHello</span>(String name){        System.out.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name:"</span> + name);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> name + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",你好!"</span>;    }    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//可以指定wsdl中的方法名,参数名和返回值</span>    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebMethod</span>(operationName=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"sayHello"</span>)    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> @<span class="hljs-title" style="box-sizing: border-box;">WebResult</span>(name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"result"</span>) String sayHello2(<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebParam</span>(name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>) String name,<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@WebParam</span>(name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"age"</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> age){        System.out.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name:"</span> + name);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> name + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">",你好!,年龄为:"</span> + age;    }    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 一个端口可以发布多个ws服务</span>        String address=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://192.168.1.105/ws"</span>;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 创建一个服务端点, banding服务的实现类</span>        Endpoint.publish(address, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> MyWebService());        System.out.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"访问wsdl的地址为:"</span> + address + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"?WSDL"</span>);    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>

通过上面这些注解,我将ws服务相关的信息给重新配置了,运行一下,来对比注解看一下生成的wsdl: 
这里写图片描述

这里写图片描述 
  可以看出,生成的wsdl中的配置完全按照我们自己指定的来,这样通过解析该wsdl文件得到的java代码中的类以及方法也是按照自定义的来,这就能满足实际中具体的要求了。 
  


—–乐于分享,共同进步! 
—–我的博客主页:http://blog.csdn.net/eson_15

0 0
原创粉丝点击