web-dev-qa-db-ja.com

WADLの問題/契約優先アプローチでJerseyを使用して生成されたXSD

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

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


環境

これらの3つの形式で交換されるオブジェクトを定義するために、私は "contract-first"アプローチに従いました。

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

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

その目的のために、おかげで this 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();
        }
     }
    

このようにして、/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つの定義)。


質問

  1. この自動生成されたXSDの生成と拡散を無効にする方法はありますか? (私はこの「契約優先」アプローチに従っているので、それは必要ないので)

  2. そうでない場合は、/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チームから修正を取得するためにフォローアップしています。

55
Marc Carré

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に含まれません。

1
Marsha