XFire的标注服务开发

来源:互联网 发布:网络电视机顶盒的安装 编辑:程序博客网 时间:2024/05/01 06:59

 package echo;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "EchoService", serviceName = "EchoServiceTest", targetNamespace = "http://www.cnpeng.org/HelloWorld")
public class Jsr181EchoService {
 @WebMethod(operationName = "echoString", action = "urn:EchoString")
 @WebResult(name = "echoResult")
 public String echo(@WebParam(name = "echoParama", header = true)
 String inputa, @WebParam(name = "echoParamb", header = true)
 String inputb) {
  return inputa + inputb;
 }
}

 

 

这个代码中有很多标注,绝大部分都可以在最后生成的 WSDL 文档中找到对应值。
@WebService 这个标注放置在 Java 类之前,注明这个类的部分方法可以被发布为Web 服务(还记得上一章提到的标注嘛?这个标注最终被 XFire 读取后进行分析后会进一步处理成 Web 服务) 。它的属性用于设置  Web 服务被发布时的配置信息,常用的属性包括: 
name(可选) :Web 服务的名字,WSDL 中 wsdl:portType元素的 name属性和它保持一致,默认是 Java类或者接口的名字,也可以进行自定义,例如本例中的 EchoService。  

serviceName(可选) :Web 服务的服务名,WSDL 中 wsdl:service元素的 name 属性和它保持一致,默认是 Java类的名字(Jsr181EchoService) ,不过如果设置了 name 属性,则名字改为 name 属性的取值。
targetNamespace(可选) : WSDL 文件所使用的 namespace,该 Web 服务中所产生的其他 XML文档同样采用这个作为 namespace,一般取值为 Web 服务所在网站的名字,不过看起来任意取值并无出错之处。 
@WebMethod(可选) 标注放在需要发布成 Web 服务的方法之前,有一些属性可以设置。例如 openrationName指明了 SOAP 调用时所看到的方法名为 echoString,而不是类中的方法名 echo,action 则定义了操作的类型。一个类里面可以定义多个
@WebMethod。
@WebResult(可选)标注定义了返回值(SOAP Response Envolope)中的 name(名字)为 echoResult。
@WebParam(可选)则定义了哪些参数可以作为 Web 服务中的远程可见的参数被调用,name设置了其属性。
乍看之下,这个 Web 服务中所用的标注有点多,实际上,这些标注可以不加任何属性,例如只写下@WebService,@WebMethod 即可,甚至于整个类只需要一个@WebService标注即可,此时代码如下所示:


package echo;
 
import javax.jws.WebService;
 
@WebService
public class Jsr181EchoService {
  public String echo(
  String input) {
   return input;
 }

}

。此时最后所生成的 Web 服务中,所有的操作名,方法名和参数名都和此通 Java 类中的
名称一致。在这种情况下,该 Web 服务的访问地址应为:
http://localhost:8080/HelloWorldService/services/Jsr181EchoService?wsdl
  最后一步,乃是在 XFire中配置并发布此服务了,在 services.xml 中加入的 Web 服务
配置格式如下:
  <service>
   <!-- 如果配置文件中配置了额外的name属性,那么最终的Web Service 名字将会
以此处为准,即:
   ServiceName?wsdl;同样的namespace的取值也会覆盖Java类中的标注的
值。
   <name>ServiceName</name>
   <namespace>http://www.cnpeng.org/HelloEcho</namespace>
  -->
   <serviceClass>echo.Jsr181EchoService</serviceClass>
   <serviceFactory>
   org.codehaus.xfire.annotations.AnnotationServiceFactory
   </serviceFactory>
  </service>
,此配置相当的简单,需要注意的是 serviceClass 就是我们写有 Web 服务标注的 Java类,而 serviceFactory 则必须是 AnnotationServiceFactory(标注服务工厂) ,否则此 Web 服务将无法正常发布。
进行测试了:
http://localhost:8080/HelloWorldService/services/EchoServiceTest?wsdl
EchoServiceTest 的名字是因为在类中标注了@WebService 的 serviceName 属性。之后就可以在 Web Service Explorer 中对它进行测试,或者是生成客户端代码。