大夢想家

          5年開發工程師,2年實施經理,X年售前顧問,......

          公告

          5年開發工程師,2年實施經理,X年售前顧問,......
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          統計

          • 隨筆 - 130
          • 文章 - 5
          • 評論 - 427
          • 引用 - 0

          常用鏈接

          留言簿(23)

          我參與的團隊

          隨筆分類(188)

          隨筆檔案(123)

          文章分類(3)

          文章檔案(7)

          Friends

          Java Link

          My Link

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 262387
          • 排名 - 217

          最新評論

          閱讀排行榜

          評論排行榜

          EJB3下無狀態會話Bean發布為WebService

              無狀態會話Bean發布為WebService是非常有意義的,因為如果我們將每一個EJB模塊按照SOA的思想做成一個一個獨立的服務模塊(這里不討論SCA,我認為Apache的SCA框架還不夠強大,文檔還不夠全面),同樣的代碼在JavaEE體系之內的應用程序可以直接使用EJB3直接訪問,JavaEE體系之外的應用程序可以直接使用WebService訪問,這一點是非常有意義的。

              下面要考慮的就是如何只寫一份代碼,讓它能做兩樣事情。

              網上有大量的使用EJB3發布WebService的教程,但是這些教程都是一個人寫的,基本上沒有太大的參考價值。最重要的是,他寫的元注釋都是寫在實現類上的,接口上沒有做任何描述。這種做法有兩個問題,第一如果你的會話Bean使用了EM,那么麻煩了,JAXB在做綁定的時候不認識接口;第二WSDL文件的描述實際上應該是基于接口的描述,應該和實現類沒有太大的關系。

              看看網上流行的代碼:

           

          1@WebService(name = "PurchaseArrival", serviceName = "PurchaseArrivalService"
          2@SOAPBinding(style = SOAPBinding.Style.RPC) 
          3public class PurchaseArrivalImpl implements IPurchaseArrival {

           

          注意,基于RPC綁定模式下List,Set一類的接口都是不可傳輸的,這點會很麻煩,要用必須用實現類。

          看看我的代碼:

          接口:

           

          1@WebService(name = "ILogRemoteService",targetNamespace = "http://www.glnpu.com/dmp/xml"
          2@SOAPBinding(style = SOAPBinding.Style.DOCUMENT) 
          3public interface  ILogRemoteService {

           

          實現類:

           

          1@Stateless 
          2@Remote(ILogRemoteService.class
          3@WebService(endpointInterface = "com.glnpu.dmp.server.service.base.log.ILogRemoteService",serviceName = "LogRemoteService"
          4public class LogRemoteService extends BaseService implements ILogRemoteService {

           

          這個WebService是針對接口發布出去,而且使用的DOCUMENT樣式,可以直接使用List、Set的接口。

          這個WebService生成的WSDL文件很有意思:

           

           1<definitions name="LogRemoteService" targetNamespace="http://impl.log.base.service.server.dmp.glnpu.com/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://www.glnpu.com/dmp/xml" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://impl.log.base.service.server.dmp.glnpu.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
           2
           3<import location="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService?wsdl&resource=ILogRemoteService_PortType25057.wsdl" namespace="http://www.glnpu.com/dmp/xml" />
           4
           5<service name="LogRemoteService">
           6
           7<port binding="ns1:ILogRemoteServiceBinding" name="LogRemoteServicePort">
           8
           9<soap:address location="http://127.0.0.1:8080/LogRemoteServiceService/LogRemoteService" />
          10
          11</port>
          12
          13</service>
          14
          15</definitions>
          16
          17

           

          里面有import來指引到真正的WSDL文件。這樣很容易將會話Bean變成WS~一樣的代碼兩樣的功能,超值!



          客戶虐我千百遍,我待客戶如初戀!

          posted on 2009-07-02 13:54 阿南 閱讀(1954) 評論(0)  編輯  收藏 所屬分類: EJB3個人原創

          主站蜘蛛池模板: 九台市| 凤翔县| 永安市| 翁牛特旗| 邳州市| 项城市| 胶南市| 英吉沙县| 嘉禾县| 泾阳县| 永和县| 诸城市| 胶南市| 宝山区| 龙泉市| 松原市| 西城区| 西安市| 桃江县| 蛟河市| 吉木萨尔县| 安新县| 长宁县| 怀远县| 汶川县| 颍上县| 恭城| 五莲县| 喀什市| 夏津县| 个旧市| 平乡县| 稻城县| 轮台县| 佳木斯市| 乐安县| 兴安县| 塔城市| 桓仁| 固阳县| 辛集市|