標籤:local 開發 輕量 oca spring api 十分 上交 http
一、概念1、什麼是webservice
Web service是一個平台獨立的,低耦合的,自包含的、基於可程式化的web的應用程式,可使用開放的XML標準來描述、發布、發現、協調和配置這些應用程式,用於開發分布式的互操作的應用程式。
2、wsdl
網路服務描述語言是一個用來描述Web服務和說明如何與Web服務通訊的XML(標準通用標記語言 (SGML)的子集)語言。為使用者提供詳細的介面說明書。
3、soap
簡易物件存取通訊協定 (SOAP)是交換資料的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言 (SGML)下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的資訊。
4、JAX-WS
一種 Java 規範,名為 JAX-WS(JSR-224),全稱 Java API for XML-Based Web Services,可以將規範理解為官方定義的一系列介面。即一般所說的SOAP風格。
5、JAX-RS
為了讓 WS 的開發與使用變得更加簡單、更加輕量級,於是出現了另一種風格的 WS,名為 JAX-RS(JSR-339),全稱 Java API for RESTful Web Services,同樣也是一種規範,同樣也有若干實現,cxf是其中比較著名的一種。
二、使用cxf發布soap風格的webservice服務1、如何發布服務直接看這篇:Web Service 那點事兒(2)—— 使用 CXF 開發 SOAP 服務
文章講的十分明白易懂,如果想快速上手,跳過文章的前兩部分,直接看第三部分:“3. 在 Web 容器中使用 Spring + CXF 發布 WS”2、可能出現的問題(1)最佳化實踐在“Web Service 那點事兒(2)—— 使用 CXF 開發 SOAP 服務 ”這篇文章中,介面唯寫加了最基本的註解,比如下面這樣:
@WebService
public interface HelloService {
String say(String name);
}
這樣雖然也能用,但是在實際使用中容易出現各種各樣的奇怪問題,所以建議把介面名、命名空間、參數聲明之類的都加上,比如下面這樣:
@WebService(targetNamespace="http://service.sky.com/",name="GoodDay",serviceName="GoodDay")
public interface GoodDay {
@WebMethod(action = "http://service.sky.com/SayHello")
public String SayHello(@WebParam(name = "uname",targetNamespace="http://service.sky.com/")String uname);
}
(2)javax.xml.bind.UnmarshalException: 意外的元素 (uri:"http://service.sky.com/", local:"uname")。所需元素為<{}uname>出現原因是為參數設定了參數名,卻沒有設定命名空間。比如,介面寫成如下這樣,就很容易出現這個錯誤。
@WebService(targetNamespace="http://service.sky.com/",name="GoodDay",serviceName="GoodDay")
public interface GoodDay {
@WebMethod(action = "http://service.sky.com/SayHello")
public String SayHello(@WebParam(name = "uname")String uname);
}
解決方案是為參數加上命名空間,如下所示:
@WebService(targetNamespace="http://service.sky.com/",name="GoodDay",serviceName="GoodDay")
public interface GoodDay {
@WebMethod(action = "http://service.sky.com/SayHello")
public String SayHello(@WebParam(name = "uname",targetNamespace="http://service.sky.com/")String uname);
}
當然這種寫法很麻煩,如果有其他辦法請大家不吝賜教。
來自為知筆記(Wiz)
使用CXF發布webservice服務及注意要點