扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
这个类必须是public,它的参数、返回值、和异常在每个JAX RPC规范中都描述了Java转化成XML/WSDL映射文件的规则等等。参数和返回值可以是原始类型、数组等等;异常都可以继承Exception;请查阅Java API去看基于XML的远程调用可以知道更多的信息。
现在我们已经拥有了合理规范,让我们接近代码来看看WebService Annotation的作用。注意:这篇文章不是描述所有Annotation 和所有的WebService Metadat规范里面的所有成员。如果要了解细节自己去查阅JSR 181规范。
这里有各种类型的Annotation。@WebService和@WebMethod是WSDL映射Annatotion。这些Annotation将描述Web Service的WSDL文档元素和Java源代码联系在一起。@SOAPBinding是一个绑定的annotation用来说明网络协议和格式。
@WebService annotation的元素name,serviceName和targetNamespace成员用来描述wsdl:portType,wsdl:service,和targetNameSpace生成WebService中的WSDL文件。
@SOAPBinding是一个用来描述SOAP格式和RPC的协议的绑定Annotation。
@WebMethod Annotation的operationName成员描述了wsdl:operation,而且它的操作描述了WSDL文档中的SOAPAction头部。这是客户端必须要放入到SQAPHeader中的数值,SOAP 1.1中的一种约束。
@WebParam Annotation的partName成员描述了WSDL文档中的wsdl:part。
@WebResult Annotation的partName成员描述了wsdl:part用来返回WSDL文档的值。
HelloException类是一个含有属性description和错误代码的异常类,Person是一个只有lastname和firstname 属性的简单类。这些类都没有被任何Annotation注释过。
我们在HelloException中使用@WebFault确实很诱人,可是并非如此!Annotation是被wsgen用来生成异常bean。更加有趣的是,这个不是JSR 181规范中的一部分,但是是JAX-RPC 1.1中的一部分。
在我们转移到wsgen之前,一个很好的功能需要我们注意的是我们如何重载一个函数使得它成为一个WebService的操作。我们通过不同的@WebMethod的operationName元素值来激活这个功能,这里的重载函数hello()和hello(person)有了不同的operationName元素各自命名为hello和quickHello。
现在为我们的服务应用程序运行Apache Ant的编译工作。利用wsgen通过这样的方式来生成build文件夹用来包含编译过的class文件和一个wsdl文件夹用来放置WSDL文档。
wsgen
拥有Web Service Annotation的HelloServer 类无法成功发布因为它包含了额外的没有被注释为WebService的HelloException类或者没有绑定Java XML,如果HelloServer的函数没有抛出异常,我们就不能使用wsgen。尽管如此,在实际应用中,这种做法是不推崇的;因此使用wsgen的目的是为了创建一个能够使用WebService的类。
wsgen是一个命令行功能用来生成合适的JAX-WS。它读取WebService的终端类文件,在我们的例子中就是com.techyatra.hellows.HelloServer,同时生成所有用于WebService发布的源代码文件和经过编译过的二进制类文件。它还随意生成WSDL和符合规范的HelloServer类WebService。wsgen从资源文件生成一个完整的操作列表是合法的。
为了方便,这篇文章的源代码mustangws文件夹中包含了一个wsgenHello.bat批处理文件,里面包含了我们的Server项目中所需要的wsgen命令行的操作。
运行mustangws中的mustangws/wsgenHello.bat文件产生HelloExceptionBean源文件和编译过的class文件放入com.techyatra.hellows.jaxb文件夹中。这些类绑定了关于Java-XML的所有操作。
现在我们有了发布WebService的所有需要的条件,在我们发布这个服务之前,让我们再看一看将运行过程加入到WebService的调用队列。这个相当敏捷万一所有的通用过程都是调用这些服务所需要的过程,如此执行过程对所有的操作者来说都是合法的。操作者允许应用程序介绍自定义和核心商业需求域之外的特殊处理。这个操作者同样会执行安全检查,据使用统计,编码和解码数据,提供给其它模块开发者使用。
Handlers
从客户端(服务消费者)发送到服务端(服务提供者)的SOAP消息通过Java SE6中的JAX-WS处理管道来完成。Java SE 6提供了一个位于javax.xml.ws.handler包内的名为Handler的操作者解释器,能够插入到执行管道用来执行自定义、特殊应用程序程序传送绑定或者没有绑定的消息。两种Handler的类型都是合法的:logical和SOAP。SOAP操作者能够操作所有完整的SOAP消息,包括SOAP头部和SOAP的主体,而logical操作者仅仅能够操作SOAP主体有负载的部分。
我们的服务器包括了com.techyatra.hello.TraceHandler SOAP 操作者。它解释了没有绑定和经过绑定的SOAP消息,而且将内容输出在System.out显示出来:
/* * TraceHandler.java * @author shahga */ package com.techyatra.hellows; ... public class TraceHandler implements SOAPHandler<SOAPMessageContext> { ... public boolean handleMessage(SOAPMessageContext messageContext) { trace(messageContext); return true; } public boolean handleFault(SOAPMessageContext messageContext) { trace(messageContext); return true; } ... private void trace(SOAPMessageContext messageContext) { Boolean outMessageIndicator = (Boolean) messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outMessageIndicator.booleanValue()) { System.out.println("\nOutbound SOAP:"); } else { System.out.println("\nInbound SOAP:"); } SOAPMessage message = messageContext.getMessage(); try { message.writeTo(System.out); System.out.println(""); } catch (Exception exp) { System.out.println("Exception in TraceHandler:trace(messageContext) : " + exp); } } } |
TraceHandler实现了javax.xml.ws.handler.SOAPHandler< c extends MessageContext> 接口。方法handleMessage()和handleFault()将未绑定和没有绑定的SOAP消息传输到System.out管道。这个功能提供给SOAPMessageContext,这部分聚合了所有SOAP消息,它包含了各种消息属性和SOAP消息本身。
现在我们有一个准备好了操作者的WebService,我们应该如何包装和部署这样的服务呢?这个服务打包成下边我们要讨论的一个jar文件,但是看起来更加兴奋。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者