上一篇寫了個最簡單的小例子,只是爲了說明JAVA6開發Web Service很方便,這一篇稍微深入一點,寫個稍微有點代表性的小例子。
依然使用 JAX-WS(jdk自帶的實現)方式,這次要在服務中使用一個複雜類型Customer,並實現附件傳輸的功能,這裏使用MTOM的附件傳輸方式。MTOM(SOAP Message Transmission Optimization Mechanism)是SOAP 消息傳輸優化機制,MTOM可以在SOAP 消息中發送二進制數據。
先來看Customer類:
MTOM 方式中要傳輸的附件必須使用javax.activation.DataHandler 類,還要注意必須在類上使用@XmlAccessorType(FIELD)註解,標註JAXB 在進行JAVA 對象與XML 之間進行轉換時只關注字段,而不關注屬性(getXXX()方法),否則發佈Web 服務時會報出現了兩個imageData 屬性的錯誤,原因未知,可能是BUG。
然後使用@XmlMimeType 註解標註這是一個附件類型的數據,這裏我們標註imageData 是一個二進制文件,當然你也可以使用具體的MIME類型,譬如:image/jpg、image/gif 等,但要考慮到客戶端是否支持。
接口類:
@MTOM註解用於開啓MTOM功能。
@WebService註解中的name屬性標註在接口類上,可以指定wsdl中接口名稱,也就是生成的客戶端代碼中接口類的名字。
@SOAPBinding(style = SOAPBinding.Style.RPC)指定SOAP消息樣式,有兩個枚舉值:SOAPBinding.Style.DOCUMENT(默認)和SOAPBinding.Style.RPC,可以對比這兩種方式生成的wsdl會有所不同,而且生成的客戶端代碼也會有所不同。
實現類:
@WebService註解的serviceName屬性指定wsdl中service節點的name屬性值。portName屬性指定wsdl中service節點下port節點name屬性值。targetNamespace屬性指定wsdl根節點definitions的targetNamespace屬性值。endpointInterface屬性指定要發佈的WebService接口的全路徑名,當實現類實現了多個接口時,需要通過此屬性標註哪個類是WebService的服務端點接口(SEI)。
在這個類中,通過@Resource註解注入了一個WebServiceContext對象,這個對象即是WebService的上下文環境。
發佈這個服務:
在命令行鍵入“wsimport -p com.why.client -keep http://localhost:8080/helloService?wsdl”生成客戶端代碼,拷貝到工程相應文件夾裏,這時,就可以調用這個服務了:
附件是我的工程,當然運行這個程序,需先在C盤建立幾個文件c1.jpg、c2.jpg、origin.jpg和why.jpg。
轉載自:http://wuhongyu.iteye.com/blog/807836