2009-04-18 5 views
11

Webサービスを開発するためのより良いアプローチはどれですか。最初に契約するか最後に契約するか?
それぞれのメリットとデメリットは何ですか?Webサービスのより良いアプローチ - 最初に契約するか、最後に契約するか?

これまでにお持ちの経験はありますか?

この質問は、Webサービスの実装についてですEDIT (読み:SOAP)を 質問が実装クラスは、第1、(最後の契約)そこから生成されたWSDLおよびXSDスキーマ符号化されるべきかどうかですかWSDLとXSDスキーマが最初に作成され、実装クラスが生成されます(最初に契約する)

+0

各側の長所と短所について質問するので、私はそれが主観的であるとは思わない。 –

答えて

8

契約優先は、一般に認められている「ベストプラクティス」です。

これは、サービスのプロデューサとコンシューマの両方が、必要なものと期待されるものを正確に明確にします。これは、java型 - > xml型の変換を開始しようとするときに特に重要になります。また、異なるWebサービス間でスキーマを再利用することもできます。

+0

大きなファイルのアップロードのようなもののために、契約の中でストリームのようなものをどのように定義しますか? – Fireworks

+0

@Fireworks契約で定義する必要はありません。これはすでに標準です。 1つはMIME(古いスタイル)またはMTOM(最も頻繁に使用される)を使用できます。 – Raman

0

私はその答えが "それに依存する"と確信しています。

をビルドして契約書を公開すると、問題が発生することがあります。これにより、変更が困難になります。不可能ではありませんが、より困難です。

一方、スキーマなどに慣れていれば、コードよりも契約を混乱させる方が速いです。契約の段階的な変更を行うことができます。

WSDLからコードスケルトンを生成するツールはありませんか?私はほぼポジティブです。そうであれば、スキーマを「コード」アイテムにしてコードを生成することもできます。

+1

このようなツールがあります。 Java空間では、Apache Software Foundationなどが、コードの生成を達成するためのさまざまなツールを提供しています。例えばXMLBeans。また、いくつかのAPIがそれを行うことができます。 JAXB APIはすべてxmlをJavaオブジェクトにバインドすることに関するもので、JAX-WS APIにはWSDLを解析してJavaクラスを生成するツールwsimportが含まれています。 –

6

私は両方のアプローチを使用しました。私の提案はの最初にというスキーマを使用しますが、のコードは最初に WSDLです。

WSDLファイルの作成には、バインディングやポートなどのニュアンスがあります。私はむしろ手ではなく道具でこれをやります。そこにこれを行うに役立つツールがありますが、それらのどれも

、あなたの展開を確認す​​ることができる非常に少なくとも、
@WebService 
public ...

よりも単純ではありません。

スキーマでは、XMLスキーマ言語がJavaで記述できる言語よりもはるかに豊富であるため、の最初のコードはです。私が通常与える例は、XMLスキーマが文字列のサイズを制限し、正規表現パターンを適用できることを示しています。 Javaや注釈でこれを行うのはちょっと面倒です。

スキーマをコントラクトとして最初に行うもう1つの利点は、スキーマファイルをHTMLドキュメントに変換するツールがあることです。

XJCツールは、必要なクラスファイルを生成できます。しかし、私は最初にそれを行うことをお勧めします。

最後に、生成されたWSDLファイルを使用して、その代わりに作業する必要があります。そうすれば、wsimportを使用して、WSDLからSchemaまでのすべてが有効であることを検証できます。

@WebService実装のwsdlLocation属性を使用してWSDLファイルを使用してデプロイすることができます。ユーザーがサーバーからWSDLを要求してもバインディングデータは修正されますが、アノテーションは保持されます。そうしないと、注釈は要求されたWSDLファイルには表示されません。

+0

あなたのハイブリッドアプローチは興味深いですが、実際にどのように配置するかはわかりません。最初に、WSで使用されるBeanクラスを記述するスキーマを作成してから、XJCを使用してクラスを作成しますが、生成されたWSDLでこのスキーマをどのように使用しますか? – Pino

+0

合意しました。これは非常に便利です。 Spring-WSはこれを行いますが、スキーマに基づいてコントラクトを先に実行し、WSDLが要求されたときに実行時にWSDLを生成することで、さらに進歩します。そうすれば、WSDLをまったく混乱させることはありません。 – Raman

+0

@Pinoはサービスのメソッドでクラスを使用するだけです。 https://github.com/trajano/app/tree/master/app-webにはその例があります。 –

関連する問題