XML コンテンツに JAXB オブジェクトを使用したリソース・メソッドの実装

Java Architecture for XML Binding (JAXB) アノテーション付きクラスを使用すると、要求と応答の XML を処理できます。

このタスクについて

JAXB オブジェクトを要求エンティティー・パラメーターおよび応答エンティティーとして Java™ API for RESTful Web Services (JAX-RS) アプリケーションに使用できます。XML とネイティブ Java 型の間で変換するという冗長な方法ではなく、JAXB オブジェクト使用の利点を活用できます。javax.xml.transform.Source インターフェース、 java.io.InputStream インターフェース、または java.lang.String インターフェースを 使用するか、さらに単純なバイト配列を使用しても、XML を 要求エンティティーまたは応答エンティティーとして保管できますが、JAXB を使用するとデータ・バインディングが簡単になります。

JAX-RS ランタイム環境には、JAXB オブジェクトをエンティティーとして読み取ったり書き込んだりするための標準的な MessageBodyReader プロバイダー・インターフェースおよび MessageBodyWriter プロバイダー・インターフェースがあります。

デフォルトで、JAX-RS ランタイム環境は、JAXB クラスのデフォルトの JAXBContext クラスを作成および使用しようと試みます。ただし、デフォルトの JAXBContext クラスが適切でない場合、JAX-RS ContextResolver プロバイダー・インターフェースを使用してアプリケーションの JAXBContext を使用できます。

手順

  1. リソース・メソッドを作成します。

    リソース・メソッドが XML コンテンツを戻すようにするには、JAXB クラスのインスタンスを直接戻すか、JAXB オブジェクトを応答エンティティーとして含む javax.ws.rs.core.Response オブジェクトを戻します。

    例えば BookList が JAXB クラスとするとします。例:
    @GET
    @Produces("application/xml", "text/xml")
    public BookList getBookList() {
        BookList list = /* get a book list */
        return list;
    }
    
    or
    
    @GET
    @Produces("application/xml", "text/xml")
    public javax.ws.rs.core.Response getBookList() {
        BookList list = /* get a book list */
        return Response.ok(list).build();
    }
    この例では、application/xml および text/xml がリソース・メソッドから作成されています。
  2. JAXB クラスを使用してリソース・メソッドのエンティティー・パラメーターを定義して、要求エンティティーの XML を処理します。
    例えば Book が JAXB クラスとするとします。例:
    @POST
    @Consumes("application/xml", "text/xml")
    @Produces("application/xml", "text/xml")
    public Book createBook(Book aBook) {
        /* store aBook into a data store */
        return aBook;
    }
    注: JAXB オブジェクトを要求エンティティー・パラメーターおよび応答エンティティーとして使用するには、jaxb クラスが jaxb 仕様に対して有効であることを確認する必要があります。
  3. (オプション) JAX-RS ランタイム環境で適切な JAXBContext インスタンスを作成できない場合、javax.ws.rs.ext.ContextResolver インターフェースを実装するクラスを作成できます。 このシナリオが実行される理由は、アプリケーションの JAXB クラスが複雑であることです。@Provider アノテーションをクラスに追加する必要があります。例:
    @Provider
    public class MyContextResolver implements ContextResolver<JAXBContext> {
         public JAXBContext getContext(Class<?> aType) {
             if(aType == Book.class) {
                 JAXBContext myContext = /* This statement creates create a JAXB Context. */ 
                 return myContext;
             }
             /* This method returns null for any types not understood.
                If null is returned, other application supplied ContextResolver<JAXBContext>
                will be used if available */
             return null;
         }
     }
    このクラスを、リソース・クラスで実行したのと同じように、一連のクラスに追加してアプリケーションのサブクラスに戻るようにします。

タスクの結果

JAXB クラスが XML コンテンツを取り込んで作成できるように JAX-RS Web アプリケーションを構成できました。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_xmlcontent_jaxb
ファイル名:twbs_jaxrs_xmlcontent_jaxb.html