为什么80%的码农都做不了架构师?>>>   hot3.png

介绍

在之前的文章中,有一篇关于HandlerChain的介绍。当时HandlerChain使用的是Java Annotation方式注册到WebService上的。我们也可以使用JAX-WS提供的针对WSDL的customization,来配置HandlerChain。JAX-WS的规范中,定义了针对WSDL的customization,可以对以下内容进行定制:

  1. Package name

  2. Wrapper style

  3. Asynchrony

  4. Provider interface

  5. Class

  6. Java method

  7. Java parameter

  8. Java doc

  9. XML schema

  10. Handler chain

这些customization,可以对wsimport产生影响。wsimport会根据WSDL+Customization产生出定制化的实现类。

声明

Customization有两种声明方式:

  1. External, 即脱离WSDL文件,单独放在一个外部文件中。

  2. Embedded,内嵌在WSDL文件中。

Embedded方式跟External方式均必须放置在如下XML节点中:

<jaxws:bindings xmlns:jaxws="">
</jaxws:bindings>

不同的是,在外部声明方式中,需要指明wsdl的位置,也需要指明customization所针对的wsdl中的节点。embedded方式就没有这种烦恼了。

外部声明示例:

<jaxws:bindingswsdlLocation="http://127.0.0.1:8080/library/service?wsdl"jaxws:xmlns="http://java.sun.com/xml/ns/jaxws"><jaxws:bindings node="wsdl:definitions"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"><jaxws:package name="external_customize.client"/>...</jaxws:bindings>
</jaxws:bindings>

接下来,我将给出一个实例。下面的实例。

实例

说明

在JAXWS的官方网站中,提供了一个配置Provider的实例。实例对客户端接口进行了定制,修改各种名字,以表现的像本地API。我以此为例做解释。

服务端

在服务端,提供了一个加法服务。只对正数提供服务,负数会抛异常。

@WebService (serviceName = "AddNumbersService", targetNamespace = "http://duke.example.org")
public class AddNumbersImpl {/*** @param number1 must be > 0* @param number2 must be > 0* @return The sum* @throws AddNumbersException*             if any of the numbers to be added is negative.*/public int addNumbers (int number1, int number2) throws AddNumbersException {if(number1 < 0 || number2 < 0){throw new AddNumbersException ("Negative number cant be added!", "Numbers: "+number1+", "+number2);}return number1 + number2;}
}

异常

@javax.xml.ws.WebFault(name = "AddNumbersException", targetNamespace = "http://duke.example.org")
public class AddNumbersException extends Exception {String info;public AddNumbersException(String message, String detail) {super(message);this.info = detail;}public String getFaultInfo() {return info;}
}

打包部署

首先,使用wsgen命令,生成相应的WSDL文件和一系列的JAXB所需类文件。

然后创建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'><endpointname='numbers'implementation='com.mycompany.AddNumbersImpl'url-pattern='/addNumbers'/>
</endpoints>

然后打包部署到tomcat中。

客户端

在使用wsimport生成客户端之前,先创建customization文件,将原SEI重命名。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"wsdlLocation="http://localhost:8080/library/addNumbers?wsdl"xmlns="http://java.sun.com/xml/ns/jaxws"><package name="external_customize.client"/><!-- default settings --><enableWrapperStyle>true</enableWrapperStyle><enableAsyncMapping>false</enableAsyncMapping><!-- wsdl:portType customization --><bindings node="wsdl:definitions/wsdl:portType[@name='AddNumbersImpl']"><!-- change the generated SEI class --><class name="MathUtil"/><!-- you can also override the following customization settings --><enableWrapperStyle>true</enableWrapperStyle><enableAsyncMapping>false</enableAsyncMapping></bindings><!-- wsdl:portType operation customization -->    <bindings node="wsdl:definitions/wsdl:portType[@name='AddNumbersImpl']/wsdl:operation[@name='addNumbers']"><!-- change java method name from addNumbers() to add() --><method name="add"/>   <!-- rename method parameters-->           <parameter part="wsdl:definitions/wsdl:message[@name='addNumbers']/wsdl:part[@name='parameters']" childElementName="tns:number1" name="num1"/><parameter part="wsdl:definitions/wsdl:message[@name='addNumbers']/wsdl:part[@name='parameters']" childElementName="tns:number2" name="num2"/>      <!-- you can also override the following customization settings --><enableWrapperStyle>true</enableWrapperStyle><enableAsyncMapping>false</enableAsyncMapping></bindings> <!-- change the generated exception class name --><bindings node="wsdl:definitions/wsdl:portType[@name='AddNumbersImpl']/wsdl:operation[@name='addNumbers']/wsdl:fault[@name='AddNumbersException']"><class name="MathUtilException"/></bindings><!-- wsdl:service customization --><bindings node="wsdl:definitions/wsdl:service[@name='AddNumbersService']"><!-- change the generated service class --><class name="MathUtilService"/></bindings><!-- change the port accessor method --><bindings node="wsdl:definitions/wsdl:service[@name='AddNumbersService']/wsdl:port[@name='AddNumbersImplPort']"><method name="getMathUtil"/></bindings>
</bindings>

然后使用wsimport命令创建客户端实现类:

在maven中,命令如下:

          <execution><id>wsimport-from-jdk</id><goals><goal>wsimport</goal></goals><configuration><executable>${tool.wsimport}</executable><wsdlUrls><wsdlUrl>http://localhost:8080/library/addNumbers?wsdl</wsdlUrl></wsdlUrls><bindingFiles><bindingFile>/pathTo/custom-client.xml</bindingFile></bindingFiles><verbose>true</verbose><xdebug>true</xdebug></configuration></execution>

运行maven命令 mvn generate-sources, 可以生成所有的java文件。

引入生成的java文件,编写client,调用client端的service。

public class AddNumbersClient {private MathUtil port;public AddNumbersClient () {port = new MathUtilService().getMathUtil ();}public static void main (String[] args) {try {AddNumbersClient client = new AddNumbersClient ();//invoke synchronous methodclient.invoke ();} catch(MathUtilException e){System.out.println ("\tException detail: "+ e.getMessage ()+", "+e.getFaultInfo ());}}private void invoke () throws MathUtilException{int number1 = 10;int number2 = 20;System.out.printf ("Invoking addNumbers(%d, %d)\n", number1, number2);int result = port.add (number1, number2);System.out.printf ("The result of adding %d and %d is %d.\n\n", number1, number2, result);//lets make endpoint throw exceptionnumber1 = -10;System.out.printf ("Invoking addNumbers(%d, %d) and expect exception.\n", number1, number2);result = port.add (number1, number2);}
}

转载于:https://my.oschina.net/xpbug/blog/228605

JAX-WS Customization相关推荐

  1. spring和maven_具有Spring和Maven教程的JAX–WS

    spring和maven Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: ...

  2. 带有Spring和Maven教程的JAX–WS

    Spring框架通过JAX-WS提供对Web服务的远程支持,实际上,如Spring 参考文档中所述 ,有三种将Spring POJO服务公开为JAX-WS Web服务的方式: 公开基于Servlet的 ...

  3. jax ws ri 生成java类_JAX-WS(一)之使用wsgen从Java创建简单的WebService

    概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...

  4. iOS开发之 几本书

    <object_c 编程之道书> <iOS 7 UI Transition Guide> iOS开发指南:从零基础到App Store上架[国内第一本iOS架构设计图书,涵盖i ...

  5. JDK7新特性简单翻译介绍

    « 家庭特点里程碑 · 建立 日历 » JDK 7中 特点 这是由甲骨文正在开发的功能,和其他列表中,JDK 7中. 这些功能将建议列入中的Java SE 7平台JSR ,除了为实现特定的上市的. 评 ...

  6. java.awt.api_Java SE 11(18.9)中的API更新

    java.awt.api Java SE 11也被命名为18.9(基于使用发布年份和月份的新命名方案),预计将在9月的最后一周发布GA. 频繁发布新JDK版本的新方法是允许语言创建者引入新功能,并向开 ...

  7. Java SE 11(18.9)中的API更新

    Java SE 11也被命名为18.9(基于使用发布年份和月份的新命名方案),预计将在9月的最后一周发布GA. 频繁发布新JDK版本的新方法是允许语言创建者引入新功能,并向开发人员社区更快地进行API ...

  8. jboss配置ejb容器_JBoss AS 7 EJB3池配置

    jboss配置ejb容器 现在已经发布了AS 7.0.1,下面让我们看看有哪些新的EJB3功能可用. 就像我在上一篇文章中提到的那样 ,AS 7.0.1现在允许您为无状态会话bean和MDB配置池. ...

  9. apache-cxf 使用_使用Apache CXF进行Web服务学习

    apache-cxf 使用 在我的最后几个项目中,我使用了Web服务,在某些地方创建它们并在其他地方使用它们. 我认为标准任务(例如创建客户端,创建Web服务等)非常简单,如果遇到问题,有足够的资源. ...

  10. jaxb xsd生成xml_使用JAXB从XSD生成XML

    jaxb xsd生成xml 这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子. Mohamed解释了如何使用JAXB从给定的XSD生成X ...

最新文章

  1. 独家 | 探索性文本数据分析的新手教程(Amazon案例研究)
  2. 【Python学习】使用Pyinstaller将py文件导出为exe文件
  3. java的classpath是什么_JAVA初学者classpath设置情况是什么?
  4. Qt for Android gradle编译同时输出多个渠道apk
  5. 【案例】爆老师拆解同步网络seo分析思路
  6. c++ (QT)笔记
  7. 自定义控件_VIewPager显示多个Item
  8. nginx location 斜杠_【一点资讯】斜杠青年双·11买什么本最划算?光影精灵6让你做“多面娇娃” www.yidianzixun.com...
  9. 20200507:力扣151周赛下
  10. 2012-11-6 2个月小结
  11. 父与子编程之旅第十章pygame下载+安装+pip更新
  12. html布局源代码实例,网页实际案例-从设计到代码实现全过程(一)
  13. 定时任务ScheduledExecutorService
  14. java链表奇数倒序偶数顺序_将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。...
  15. 带参宏和带参函数的比较(C语言)
  16. 宽带连接显示服务器问题怎么办,宽带连接时错误678问题怎么解决【解决方法】...
  17. android x86引导修复,Android-x86 9.0-r2 发布,更新内核与UEFI引导修复
  18. input 使用outline属性去掉淡蓝色边框不生效
  19. UEFI学习2-OVMF的制作和使用
  20. 16万字智慧医疗-医院信息化大数据建设 方案

热门文章

  1. PPT2007中的剪贴画怎样修改?ppt模板下载
  2. iReport 设计介绍
  3. Android-扫描更新媒体库(图库相册)
  4. 微信公众号-测试号-网页授权
  5. R语言ggplot2数据可视化
  6. 玩一下php的pdo操作
  7. 财智金和普通信贷产品相比有什么区别,申请条件高吗?
  8. python(雪花下落)
  9. Unity3D New Input System 鼠标左键单击、双击、长按配置及实现接口多态用法(一)
  10. Matlab 实现GUI界面相应鼠标事件