私たちは、システムのコアにドメイン駆動型設計の原則に従って設計された非常に複雑なドメインモデルが含まれている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つのアプローチがありますか?
モデルへのリンクを追加するには、ドメインクラスを拡張する必要がありますが、DAOレイヤーはそのようなオブジェクトをインスタンス化できません。集約を検討し、JAXB(またはXMLマッピング)をそのレイヤーに追加します。 –
わかっている場合は、ドメインオブジェクトをリンクで集約して送信するRESTモデルを作成します。 DTOのようなものですが、リンクを含めるようにドメインを拡張するほうが似ています。私は理解していますか? – HDave
はい、私はラッパーを作成します。必要に応じて、呼び出しをDAOオブジェクトに委譲します。だから基本的に[デコレータデザインパターン](http://en.wikipedia.org/wiki/Decorator_pattern)です。 –