55

私はここ数日間、Jersey を使用して REST Web サービスに取り組んでおり、XML、JSON、Google Protobuf などのいくつかの交換フォーマットを使用して、すべての CRUD 操作を機能させることができました。

ただし、自動生成された WADL と XSD に関連するいくつかの問題に直面しています。


環境

これら 3 つの形式で交換されるオブジェクトを定義するために、「コントラクト優先」アプローチに従いました。

  • 私が作成した XSD から、JAXB を使用してモデル クラスを生成しました。
  • 私が書いた同等の proto ファイルから、Google Protobuf クラスを生成しました (そして、1 つの固有のモデルを持つために、これらを JAXB 生成オブジェクトに内部的に変換する方法があります)。

ただし、ユーザーにもクラスを生成できるようにしたいので、これらのスキーマ ファイル (.xsd および .proto) を共有し、自動生成された WADL とうまく統合したいと考えています。

そのために、このwiki ページに感謝します。

  • 下の2つのファイルを公開しました
    • /schema/schema.xsd
    • /schema/schema.proto
  • アプリケーション文法ファイルを追加しました:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <grammars xmlns="http://wadl.dev.java.net/2009/02" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xi="http://www.w3.org/1999/XML/xinclude">
        <include href="../schema/schema.xsd" />
    </grammars>
    
  • カスタマイズされた WADL ジェネレーターを追加しました。

     public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
        @Override
        public List<WadlGeneratorDescription> configure() {
            return generator(WadlGeneratorApplicationDoc.class)
                .prop("applicationDocsStream", "application-doc.xml")
                .generator(WadlGeneratorGrammarsSupport.class)
                .prop("grammarsStream", "application-grammars.xml")
                .descriptions();
        }
     }
    

このようにして、ヒットすると、WADL に以下が表示されます/rest/application.wadl

<grammars>
     <include href="../schema/schema.xsd"/>
     <include href="application.wadl/xsd0.xsd">
          <doc title="Generated" xml:lang="en"/>
     </include>
</grammars>

問題

/rest/application.wadl/xsd0.xsdは私のクラスから自動的に生成されますが、私が最初に持っていたものとはかなり異なりschema.xsdます。それに加えて、wadl2javaこの WADL のようなツールを呼び出すと、おそらく次の理由で、惨めに失敗します。

  • /schema/schema.xsd、 と
  • /rest/application.wadl/xsd0.xsd

が競合しています (同じオブジェクトに対する 2 つの定義)。


質問

  1. この自動生成された XSD の生成と拡散を無効にする方法はありますか? (この「コントラクトファースト」アプローチに従っているので必要ないため)

  2. /rest/application.wadl/xsd0.xsdそうでない場合、ヒットしたときに手動で作成した XSD でコンテンツを「オーバーライド」する方法はありますか? (カスタマイズされた WADL を生成するためにググって WadlResource について調べましたが、XSD 生成自体については何も見つかりませんでした)


よろしくお願いします。

M.


編集

1) ジャージー チームに問題を提起したところ、返信がありました: http://java.net/projects/jersey/lists/users/archive/2012-06/message/8

2) Pavel の指示に従って、チケット (JERSEY-1230) を発行しました。私は現在、自分で修正を送信するか、Jersey チームから修正を入手するためにフォローアップしています。

4

1 に答える 1