2012-01-16 19 views
5

私たちは、システムのコアにドメイン駆動型設計の原則に従って設計された非常に複雑なドメインモデルが含まれているJavaサーバーWebアプリケーションを使用しています。ほとんどの場合、これらのドメインオブジェクトは、アプリケーションによって他の懸案事項に影響されることはほとんどありません。HATEOASのリンクリレーションシップをXMLで実装する最良の方法は?

私たちは現在、システムの前にREST WebサービスAPIを配置しようとしています。私たち自身の新しいメディアタイプに含まれるHATEOASリンクを最適に実装する方法には苦労しています。

@XmlType(name = "foo") 
public class FooImpl implements Foo { 

    private String name; 
    private String id; 

    ...snip.... 

@XmlID 
@XmlAttribute 
@Override 
public String getId() { 
    return id; 
} 

    @XmlElement 
    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(final String name) { 
     this.name = name; 
    } 
} 

しかし、私はこのようなルックスを返すようにしたいXML::

は何
<foo id="123" href="http://myserver.com/foos/123"> 
    <name>myFoo</name> 
    <links> 
      <link rel="previous" href="http://myserver.com/foos/122" type="application/mything+xml" /> 
      <link rel="next" href="http://myserver.com/foos/124" type="application/mything+xml" /> 
      <link rel="edit" href="http://myserver.com/foos/123" type="application/mything+xml" /> 
      <link rel="revise" href="http://myserver.com/foos/123" method="put" type="application/mything+xml" /> 
      <link rel="cancel" href="http://myserver.com/foos/123?op="cancel"" method="post" type="application/mything+xml" /> 
    </links> 
</foo> 

例えば、我々はJAX-B注釈を含むidとnameプロパティを持つドメインクラスfooを持って言うことができますこれらのメディアタイプのリンクでドメインデザインを汚染しないようにするのに、XMLマーシャリングのためにJAX-Bの力を引き続き使用できるようにするための最良の方法は?ここにいくつかの考えがあります:

1)JAX-Bアダプター - これらを使用してエンティティのXMLを変更し、リンクを挿入できますか?それは妥当ですか?どんな例?

2)DTOレイヤー - DTOで自分のドメインオブジェクトを変換する新しいRESTサービスレイヤーを作成します。これまでのところ、私たちはDTOの面倒を避けることができました。これは私たちがクライアントに返すものに柔軟性をもたらしますが、ここではドメインに依存しないクライアントを作成するつもりはありません。

3)リンクヘッダー - このアイデアは本当に好きですが、私たちのリソースにはサブリソースの集まりが含まれているため、それだけでは機能しないと思います。この場合、サブリソースはリンク/ HREFなどを含むXMLにマーシャリングする必要があります。そのため、リンクヘッダーは問題をトップレベルタイプに解決しますが、問題全体を解決するわけではありません。他に言いたいことは自由です!

DTOを回避し、ドメインモデルに透過的なままにするためのもう1つのアプローチがありますか?

+0

モデルへのリンクを追加するには、ドメインクラスを拡張する必要がありますが、DAOレイヤーはそのようなオブジェクトをインスタンス化できません。集約を検討し、JAXB(またはXMLマッピング)をそのレイヤーに追加します。 –

+0

わかっている場合は、ドメインオブジェクトをリンクで集約して送信するRESTモデルを作成します。 DTOのよ​​うなものですが、リンクを含めるようにドメインを拡張するほうが似ています。私は理解していますか? – HDave

+2

はい、私はラッパーを作成します。必要に応じて、呼び出しをDAOオブジェクトに委譲します。だから基本的に[デコレータデザインパターン](http://en.wikipedia.org/wiki/Decorator_pattern)です。 –

答えて

2

リンクを正しく生成するには、生成されるコンテキストを知っている必要があります。つまり、単純なJAXBインターセプタは処理できません。挿入するURLはわかりません。さらに、次のリンクや以前のリンクを生成するには、それらの値が何であるかを知る必要があります。他のリソースが削除されたときにリソースがURLを変更することを意味するので、連続していると言うのはおそらく安全ではありません。これは狂気です。

最も簡単で安全な方法は、必要な情報をDAOレイヤーに委譲するラッパークラス(JAXBシリアライズアノテーションを使用)です。これはかなりの量のコードを書くことができますが、そのようなコードを正しく取得することは少なくとも簡単です。ファンシーな自動装飾ははるかに難しくなります。

0

RESTEasyは、アトムまたはヘッダーリンク経由のリンクをサポートしています。リンクされたサービスを指し示すことができる追加の注釈がいくつかあります。 RESTEasyのドキュメントの第8章を参照してください。

関連する問題