私はここ数日間、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 つの定義)。
質問
この自動生成された XSD の生成と拡散を無効にする方法はありますか? (この「コントラクトファースト」アプローチに従っているので必要ないため)
/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 チームから修正を入手するためにフォローアップしています。