XFire統合springとセルテスト


http://www.springside.org.cn/docs/Reference.htm 
1.概要
サイト:http://xifre.codehaus.org
Smallnessが書いたXFire初級中国語教程。 
公式サイトのUser GuideとQuick Start
Java Worldの文章を紹介する
XFireはAxis 2と並ぶ次世代WebServiceの枠組みです。新しい世代と呼ばれる理由は、
  • は、一連のWebサービスの新規格であるJ SR 81、WSDL 2.0、JAXB 2、WS-Securityなどをサポートしています。
  • Staxを使ってXMLを解釈し、性能が向上しました。XFireはウッドサイドをStaxとして採用して実現します。
  • Easily Create Services from POJOs;
  • Springの結合。
  • フレキシブルなBindingメカニズムは、デフォルトのAegis、xmlbeans、jaxb 2、castorを含む。
  • その中の第3、4、5項は一つのPragmaticの応用に対してとても重要です。SpringSideはこの3つを使っています。Axisよりずっと簡単なWebServiceを組み合わせたものです。
       一つのWebServiceのフレームワークに注目して、Javaコードがどのようなインターフェースと規範に従って、何のXML配置をするかに注目しています。最後にどのようなコマンドを実行してWeb Serviceを発行しますか?
    2.WebServiceの一番早い作成
    2.1.WebService用の狭いインターフェースを抽出する
    BookManger.javaはPOJOであればいいです。WebService関連コードは一切含みません。
    for WebServiceの狭いインターフェースBook Service.javaを抽出します。
    狭いインターフェースは安全のため、XXManager全体の方法をWeb Serviceとして導き出すことを望まない一方、XFireは一時的にインターフェースベースのProxyのみをサポートします。
    2.2.シンプルなAegis Bindingまで
    XFireデフォルトのAegis Binding文法は非常に簡単です。int、String、Dateなどのタイプのパラメータと返却値は定義されなくてもいいです。List findBook sByName()の返却値Listの対象はBookであればいいです。最も簡単なbinding定義を見たことがあります。他の複雑なデザインを究極の目標とする方案よりもはるかに優れています。
        <mapping>
            <method name="findBooksByName">
                <return-type componentType="org.springside.bookstore.domain.Book"/>
            </method>
        </mapping>
    
    要約を構成の代わりにするために、ServiceとEntity Beanのbindingファイルはすべてxx.aegis.xmlと命名されています。そして、元のクラスのsit togetherと同じディレクトリにいます。
    具体的な紹介はAegis Bindingを参照してください。
    2.3.Springを配置してWebサービスを導出する
       設定ファイルは、XFire Exportによって、狭いインターフェースをWebサービスにエクスポートし、Spring MVCのURL Mapperによって、あるURLに紐付けされます。    XFireはXBeanベースの書き方も提供していますが、Spring 2.0を待っているので、XBeanには及びません。一つのparent beanを抽象的に出しても、ほぼ同じです。
       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <value>/BookService=bookService</value>
            </property>
        </bean> 
     <bean id="bookService" parent="baseWebService">
            <property name="serviceBean" ref="bookManager"/>
            <property name="serviceClass" value="org.springside.bookstore.service.BookService"/>
        </bean>
     <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
            <property name="serviceFactory" ref="xfire.serviceFactory"/>
            <property name="xfire" ref="xfire"/> 
    </bean>
      このとき、XFireはWebServiceを導出し、WSDLを表示します。       http://localhost:8080/springside/service/BookService?WSDL
    Springに依存しない構成もあります。セルフでweb.xmlにservletを配置し、WEB-INF/clases/META-INF/xfireディレクトリにservices.xmlのプロファイルを配置する必要があります。
    3.Clientエンドコード
    1.lientの実現には同じPOJOs、Serviceインターフェースと対応するaegis.xmlファイルが必要です。
     public static void main(String[] args) {
      	Service serviceModel = new	ObjectServiceFactory().create(BookService.class);
     	BookService service = (BookService) new XFireProxyFactory().create(
        	serviceModel,"http://localhost:8080/springside/service/BookService");
      	
    	List list = service.findBooksByCategory(null);
      }
    2.他の動的Cient:
    Client client = new Client(new URL("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"));
    
    Object[] results = client.invoke("ConversionRate", new Object[] {"BRL", "UGX"});
    
    3.第3の方法は、XFireのWSDL->Server/Client Sideコードのantコマンドを使用して、Jaxb 2バインディングに基づくStubを生成することを試みることができる。
    4.Web Serviceのユニットテスト
    XFiireはAbstractXFireSprigTestテストクラスを提供しています。Webコンテナを起動しなくてもテストができます。
    1.protected Application Controtext createContect()方法
    この方法を実現する必要があります。定義されたApplication Contectオブジェクトに戻ります。たとえば:
    protected ApplicationContext createContext() {
         return   ClassPathXmlApplicationContext(new String[]{"classpath*:applicationContext*.xml"});
    } 
    2.テストサービス
    invokeServiceで作成したweb service要求(XML format)を呼び出すと、web serviceにアクセスし、戻ってきたdocuementが得られ、astertValidの検証結果が正しいかどうかを呼び出すことができます。
      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);
    
    FindBook ByNameの内容は以下の通りです。
    <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>
    また、hibernate操作に関しては、easyMockを使用しても良いし、RealDaoControllerTestのように、自分でopenSession、close Session操作を実現して、hibernane lazyloadの問題を避けることもできます。
    3.テストクライアントコード
    tomcatを起動しないでクライアントコードをテストするために、テストコードはAbstractXFireSpring Testに引き継がれます。localのURLを使ってテストします。
     Service serviceModel = new ObjectServiceFactory().create(BookService.class);
     XFireProxyFactory factory = new XFireProxyFactory(getXFire());
     BookService service = (BookService) factory.create(serviceModel, "xfire.local://BookService");
    二つの赤いところに注意してください。普通のClientコードとは少し違って、tomcatを起動しないでクライアントサービスのテストコードを実行する鍵を解決します。local://BookServiceのServiceNameはExportされたインターフェース名であり、Spring MVCのURL Mappingとは無関係です。
    5.安全と認証
    WS-Securityが使えます。XfireはWSS 4 Jです。 ,Spring Sideのサービス先の配置とTestCase形式のDemoのクライアントコードを詳しく見てください。 
    認証ユーザ名のパスワードを書いてもいいです。ユーザー名とパスワードはWebServiceが要求した「head」で作成します。サービスでハンデルを実現して、headerの中でパスワードを読み出して検証します。そして、ハンドルをserviceにかけます。
       <bean id="bookWebService" parent="baseWebService">
            <property name="serviceBean" ref="bookManager"/>
            <property name="serviceClass" value="org.springside.bookstore.plugins.xfire.service.BookService"/>
            <property name="inHandlers" ref="authenticationHandler"/>
        </bean>
    クライアントと同様にhandlerを実現し、ユーザ名とパスワードを要求のheadに入れ、クライアントコードにこの要求を接続し、コードを追加する。
         Client client = ((XFireProxy) Proxy.getInvocationHandler(bookService)).getClient();
         client.addOutHandler(new ClientAuthHandler());
    ユニットテストによって作成されたweb service xmlの要求も修正されました。
    6.wsdl 2 java ant task
    SpringSideのbuild.xmlファイルには、wsdl 2 javaのtargetが追加されており、XFireで提供されるwsgen taskを利用して、wsdlからクライアントコードを作成することができます。
    まずwsgentaskを導入して、wsgenを呼び出します。        
    <taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="compile.classpath"/>
    <wsgen outputDirectory="${code_path}" wsdl="${wsdl_path}" package="${code_package}" binding="xmlbeans"/>
    このうち、Output Directory属性はコードが出力されるフォルダを定義し、wsdlはwsdlファイルのパスを定義し、packageは作成されたjavaコードのpachageを定義している。bindingは省略できます。標準のbindingはJAXB 2.0です。xmlbeansにも設定できます。bindingはxmlbeansの方式を採用します。
    7.Tips
    7.1.Open Session In View
    相変わらずspringでそのfilterを使って、WebServiceのURLディレクトリにもFilterを使ってみます。
       <filter-mapping>
            <filter-name>hibernateFilter</filter-name>
            <url-pattern>/service/*</url-pattern>
        </filter-mapping>
    7.2異常処理
    以前のモードは普通WebService中間層を書いて、XXManagerを呼び出して、そして異常を処理して、転化します。
    XFireは直接export XManagerのもので、異常な処理を提供しているHandlerです。デフォルトの実装があり、拡張可能なCustoomerErrror Handlerもあります。