私はここ数日、Jerseyを使用してREST Webサービスに取り組んでおり、XML、JSON、Google Protobufなどのいくつかの交換形式ですべてのCRUD操作を機能させることができました。
ただし、自動生成されたWADLおよびXSDに関連するいくつかの問題に直面しています。
これらの3つの形式で交換されるオブジェクトを定義するために、私は "contract-first"アプローチに従いました。
ただし、ユーザーがクラスを生成できるようにしたいので、これらのスキーマファイル(.xsdおよび.proto)を共有して自動生成されたWADLと十分に統合されています。
その目的のために、おかげで this wikiページ:
/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();
}
}
このようにして、/rest/application.wadl
を押すと、以下が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
にあったものとはかなり異なります。それに加えて、このWADLでwadl2Java
のようなツールを呼び出すと、おそらく悲惨なことに失敗します。
/schema/schema.xsd
、および/rest/application.wadl/xsd0.xsd
現在、競合しています(同じオブジェクトの2つの定義)。
この自動生成されたXSDの生成と拡散を無効にする方法はありますか? (私はこの「契約優先」アプローチに従っているので、それは必要ないので)
そうでない場合は、/rest/application.wadl/xsd0.xsd
がヒットしたときに、手動で作成したXSDでコンテンツを「オーバーライド」する方法はありますか? (私はグーグルで検索し、カスタマイズされたWADLを生成するためにWadlResourceについて見つけましたが、XSD生成自体については何も見つかりませんでした)
よろしくお願いします!
M。
1)問題をJerseyチームに提起し、返信を受け取りました: http://Java.net/projects/jersey/lists/users/archive/2012-06/message/8
2)Pavelの指示に従って、チケット(JERSEY-1230)を発行しました。私は現在、自分で修正を送信するか、Jerseyチームから修正を取得するためにフォローアップしています。
1.14-SNAPSHOT これを行うことができるはずです:
public class SampleWadlGeneratorConfig extends WadlGeneratorConfig {
@Override
public List<WadlGeneratorDescription> configure() {
return generator( WadlGeneratorApplicationDoc.class )
.prop( "applicationDocsStream", "application-doc.xml" )
.generator( WadlGeneratorGrammarsSupport.class )
.prop( "grammarsStream", "application-grammars.xml" )
.prop("overrideGrammars", true) // !!!
.generator( WadlGeneratorResourceDocSupport.class )
.prop( "resourceDocStream", "resourcedoc.xml" )
.descriptions();
}
}
overrideGrammarsがtrueに設定されている場合、Jerseyで生成された文法は返されるWADLに含まれません。