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類庫及其配置文件。