XFire
支持JSR 181
标注方式的Web
服务开发,另外,所有支持Java EE 5
的应用服务器(Tomcat
只是Web
层的,本身不支持EJB
和Web
服务开发),都支持这种开发方式,例如:JBoss
,GlassFish
,WebLogic10
等等,本节就简要讨论使用XFire
开发标注式Web
服务和用JBoss
开发的过程。
15.4.1 XFire的标注服务开发
XFire支持JRS181方式的标注服务开发,这样开发的时候只需要编写一个普通的Java类,然后加上标注信息后,加入services.xml中即可。我们仍然在第2节所开发的HelloWorldService项目中进行修改。下面是创建的Web服务类echo.Jsr181EchoService:
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.openuri.org/2004/04/HelloWorld")
publicclass Jsr181EchoService
{
@WebMethod(operationName = "echoString", action = "urn:EchoString")
@WebResult(name = "echoResult")
publicString echo(@WebParam(name = "echoParam", header = true) String input)
{
return input;
}
}
|
这个代码中有很多标注,绝大部分都可以在最后生成的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
publicclass 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.un.gov/HelloEcho</namespace>
-->
<serviceClass>echo.Jsr181EchoService</serviceClass>
<serviceFactory>
org.codehaus.xfire.annotations.AnnotationServiceFactory
</serviceFactory>
</service>
|
,此配置相当的简单,需要注意的是serviceClass就是我们写有Web服务标注的Java类,而serviceFactory则必须是AnnotationServiceFactory(标注服务工厂),否则此Web服务将无法正常发布。
好了,现在按照15.2.4一节的内容发布项目并运行后,即可在浏览器中键入下面地址进行测试了:
http://localhost:8080/HelloWorldService/services/EchoServiceTest?wsdl 。
EchoServiceTest的名字是因为在类中标注了@WebService的serviceName属性。之后就可以在Web Service Explorer中对它进行测试,或者是生成客户端代码。
从这里看到这种开发方式相对也简单的多,而且您将在下一节看到如果是Java EE 5的容器,开发过程将更加的简单,而且不需要XFire类库及其配置文件。