<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    太陽雨

    痛并快樂著

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      67 Posts :: 3 Stories :: 33 Comments :: 0 Trackbacks

    XFire生火指南(下)

    請先閱讀:XFire生火指南(上)

    1. JSR181

         JSR181式通過annotated POJO ,零配置文件的導(dǎo)出Web服務(wù),是BEA倡導(dǎo)的,JavaEE5里的正規(guī)方式, XFire作了良好的支持。

         但是,XFire關(guān)于JSR181方式的文檔還不夠清晰,請完整閱讀本節(jié)以避免其中的陷阱。

    1.1 參考文章

    1.2 ApplicationContext.xml

        因為Web服務(wù)配置都寫在了annotation,applicationContext.xml文件的內(nèi)容變得比較固定。需要注意JSR181WebAnnotations與HandlerMapping不能lazy init。

    <beans default-autowire="byName">
      <!--引入XFire的預(yù)配置文件-->
     <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/> 
    <!-- 獲得applicationContext中所有bean的JSR181 annotation -->
     <bean id="webAnnotations" class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations"  lazy-init="false"/>
     <!-- 定義handler mapping,將所有JSR181定義的bean導(dǎo)出為web service -->
    <bean id="jsr181HandlerMapping" class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping"  lazy-init="false">
      <property name="xfire" ref="xfire"/>
      <property name="webAnnotations" ref="webAnnotations"/>
     </bean>
    </beans>

    1.3 Interface+Impl模式

       不同于XFire傳統(tǒng)模式,窄接口不是必須的,只是考慮到有個接口,配置都在接口上做,對原來的Manager類侵入較少。

       如果采用Interface,Interface將擔(dān)任主要的配置工作。

       首先定義@WebService,可定義自己的NameSpace,如果不定義將采用默認(rèn)的生成算法。

       接口中的函數(shù)將默認(rèn)全部導(dǎo)出,不需要再用@WebMethod注釋,也可以如下例般進(jìn)行關(guān)于Param,Result的更進(jìn)一步配置:

    @WebService(targetNamespace = "http://www.springside.org.cn")
    public interface BookService {
    @WebResult(name = "SearchResult")
    List<Book> findBooksByCategory(@WebParam(name = "category", header = true)String cateoryId);
    }

           Manager不是純粹的POJO,需要帶上@WebService注釋,指明接口。

    @WebService(serviceName = "BookService", endpointInterface = "org.springside.bookstore.components.xfire.server.jsr181.BookService")
    public class BookManager implements BookService {
    ...
    }

          陷阱一:XFire JSR181參考文檔 中在Interface中以@WebService(name="BookService")來定義ServiceName,這個做法看起來也比較合理,但實際上需要在Manager中以@WebService(serviceName ="BookService") 來定義,比較古怪。

    1.4 純POJO模式

        參考文檔中的例子,需要配置@WebMethod 指定需要導(dǎo)出的函數(shù)。

    @WebService(name = "EchoService", targetNamespace = "http://www.openuri.org/2004/04/HelloWorld")
            public class Jsr181EchoService
    {
        @WebMethod(operationName = "echoString", action = "urn:EchoString")
        @WebResult(name = "echoResult")
        public String echo(@WebParam(name = "echoParam", header = true) String input)
        {
            return input;
        }
    }

    1.5 Client注意事項

        陷阱二:和傳統(tǒng)模式的client有一點最大的區(qū)別,serviceModel需要實際的Manager類而不是接口類來做參數(shù):

    Service serviceModel = new AnnotationServiceFactory().create(BookManager.class);

    2. Client

    XFire的Client并不算強項,一共有三種模式:

    2.1 Client開發(fā)者擁有Web服務(wù)端的class

      Client與Server是同一個開發(fā)團(tuán)隊也好,Server端團(tuán)隊以jar形式提供開發(fā)包也好,反正如果能拿到服務(wù)端的接口Class和Entity類及aegis 配置文件的話。

      傳統(tǒng)POJO模式:

    Service serviceModel = new ObjectServiceFactory().create(BookService.class);
    BookService service = (BookService) new XFireProxyFactory().create(serviceModel, serviceURL);
    service.findBooksByCategory(cateoryId);

      JSR181模式,注意這里Server端開發(fā)組需要向Client提供BookService的實現(xiàn)類BookManager,而不止于接口,有點危險: 

    Service serviceModel = new AnnotationServiceFactory().create(BookManager.class);
    BookService = (BookService) new XFireProxyFactory().create(serviceModel, serviceURL);
    service.findBooksByCategory(cateoryId);

      SpringSide 用泛型封裝了一個XFireClientFactory,調(diào)用代碼如下:

    BookService service = XFireClientFactory.getClient(serviceURL, BookService.class);
    BookService service = XFireClientFactory.getJSR181Client(serviceURL, BookService.class, BookManager.class);
     

    2.2 動態(tài)模式

        動態(tài)模式不需要服務(wù)端的class,不過性能和復(fù)雜對象映射等估計做得不會太好。

    Client client = new Client(new URL("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"));
    
    Object[] results = client.invoke("ConversionRate", new Object[] {"BRL", "UGX"});

    2.3 根據(jù)WSDL生成Client Stub

        這才是Web Service Client的王道,可以訪問任意語言編寫的Web Service,將在下一個版本中演示。

        可以用XFire的Ant Task來生成,但使用MyEclipse的XFire集成會更加方便。生成的代碼必須是JDK5.0的版本。

    3. 測試

    XFiire很重要的一個特性是提供了無須啟動Web容器也能進(jìn)行單元測試的能力。

    原理就是利用XFire的JVM模式,以xfire.local://BookService channel而不是http://localhost/service/BookService來訪問服務(wù)。

    測試的方式分兩種:

    一種是純服務(wù)器角度,不編寫客戶端代碼,以SOAP XML形式發(fā)送請求,返回的也是SOAP XML字串,直接對XML進(jìn)行測試。

    一種是編寫2.1 中Client代碼來進(jìn)行測試。

    前一種的測試的隔離度較高,而后一種比較簡便。

    3.1 測試基類 

    無論那種方式,都使用Xfire的AbstractXFireSpringTest基類,實現(xiàn)createContext()回調(diào)函數(shù)。

    protected ApplicationContext createContext() {      return ClassPathXmlApplicationContext(new String[]{"classpath*:applicationContext*.xml"});
    }

    另外測試基類還要完成一個很重要的工作就是要解決Hibernate的LazyLoad問題,做到OpenSession In Test。因此,SpringSide專門封裝了一個XFireTestCase的基類。

    3.2 用Client代碼直接測試

         下文直接用client代碼調(diào)用findBooksByCategory方法,得到返回值后進(jìn)行各種Assert判斷。

         注意和普通client code的兩處區(qū)別:servericeURL換成local,factory須加入getXFire()作參數(shù)。

    Service serviceModel = new ObjectServiceFactory().create(BookService.class);
      XFireProxyFactory factory = new XFireProxyFactory(getXFire());
      BookService service = (BookService) factory.create(serviceModel, "xfire.local://BookService");
      List list = service.findBooksByCategory("0");
      assertNotNull(list);
    ...

    3.3 純服務(wù)端測試

       編寫一段SOAP XML,以任意命名保存,下文以"Java"作參數(shù),調(diào)用findBooksByName方法。

    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
        <env:Header/>
        <env:Body>
            <findBooksByName xmlns="http://www.springside.org.cn">
                <in1>Java</in1>
            </findBooksByName>
        </env:Body>
    </env:Envelope>

       測試代碼調(diào)用前面的XML,返回XML Document對象,再用基類提供的一些Assert方法檢查結(jié)果

      Document doc = invokeService("BookService","/org/springside/xfire/BookService.FindBooksByName.xml");
      assertNoFault(doc);
      addNamespace("ss", "http://domain.commons.bookstore.springside.org");
      assertValid("//ss:Book/ss:category/ss:descn= \"Java Book\"", doc);
    posted on 2010-03-05 11:44 小蟲旺福 閱讀(442) 評論(0)  編輯  收藏 所屬分類: javaEE
    主站蜘蛛池模板: 99在线免费视频| 男女一边摸一边做爽的免费视频| 很黄很污的网站免费| 亚洲自偷自偷图片| aaa毛片视频免费观看| 狠狠亚洲狠狠欧洲2019| 精品免费久久久久国产一区| 亚洲区小说区激情区图片区| 日本免费A级毛一片| 亚洲免费视频网站| 国产a视频精品免费观看| 亚洲日韩乱码中文无码蜜桃臀 | 99久久婷婷国产综合亚洲| 黄页网站在线看免费| 亚洲一区二区三区高清视频| 成人毛片免费在线观看| 日本系列1页亚洲系列| 亚洲中久无码不卡永久在线观看| 十八禁视频在线观看免费无码无遮挡骂过 | 久久亚洲精精品中文字幕| 四虎最新永久免费视频| 亚洲国产精品无码久久九九大片 | 亚洲国产精品无码久久一线| 最近中文字幕高清免费中文字幕mv | 亚洲精品tv久久久久久久久久| 国产三级在线免费观看| 亚洲免费视频网站| 四虎影院免费视频| free哆拍拍免费永久视频| 亚洲AV成人一区二区三区AV| 日韩免费一区二区三区在线| 羞羞漫画登录页面免费| 亚洲大尺度无码无码专区| 99久久人妻精品免费二区| 亚洲成年网站在线观看| 亚洲国产成人久久笫一页| 91高清免费国产自产拍2021| 亚洲妇女无套内射精| 久久噜噜噜久久亚洲va久| 成人激情免费视频| 中文字幕av免费专区|