public@WebResult(partName="result")String ping(@WebParam(partName="person", mode=Mode.IN,targetNamespace="http://mustangws.techyatra.com/") Person person) throws HelloException { if (person == null) { System.out.println("function: hello(null)... throwing exception"); throw new HelloException("0001", "Person is null"); } else { System.out.println("function: hello(person.getTitle() + person.getName())"); return "Hello. " + person.getTitle() + person.getName() + "!"; } } }
[1] [2] [3] 下一页
在上边的代码中,@WebService注释使得类MustangServer实现了Web Service,而且@WebMethod标识类中ping方法作为WebService的操作,ping除开返回greeting的值就不会做其他的事情。
需要注意的是:不管你愿意不愿意,你都不能任意地将Annotation用于任何一个Java类和函数使其暴露为一个WebService和一个WebService操作。因为Java类若要成为一个实现了WebService的bean,它需要遵循下边这些原则: 这个类必须是public类 这些类不能是final的或者abstract 这个类必须有一个公共的默认构造函数 这个类绝对不能有finalize()方法 若要成为一个实现了WebService的Bean这个Java类必须遵循这些原则: 这个类必须是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的目的是为了创建一个能够使 上一页 [1] [2] [3] [4] [5] [6] 下一页
|