2016-07-13 14 views
1

、一方のエンティティが別の関係を持って、私は巣のRESTリソースこうして:のREST APIの設計が、一般的な状況では一般的な関係を持つ

POST /user/{userId}/accounts 

そして、それはからのエンティティのためokです同じドメイン。しかし、異なるドメインのエンティティには意味をなさない。たとえば、バス回線(@Entity Line)とオペレータ(@Entity Operator)があります。私は新しいバスラインを作成する必要がある場合、私はオペレータに合格しなければならないので、

@ManyToOne 
@JoinColumn(name = "operator_id") 
private Operator operator; 

:すべての行は、オペレータがあります。

new演算子で行を作成する必要がある場合は問題ありませんが、演算子を参照するだけの場合は、何とかoperator_idを渡す必要があります。これを処理する方法をいくつかのアイデア:

1.ネストラインをオペレータに

POST /operators/{operatorId}/lines {name: "15B", type: "BUS"}

それは技術的な観点からOKですが、ラインがないので、私は、事業者と分離ラインを維持したいです実際にはオペレータに「属し」ます(ネスティング)。

2.パスoperatorId直接

POST /lines {name: "15B", type: "BUS", operator: 12}

この事でいくつかの問題があります。そこで私は、new演算子を使用して新しい行を作成したい場合場合は、で、クエリは次のようになります。

POST /lines {name: "15B", type: "BUS", operator: {name: "SuperBUS"}}

そして、私は両方の状況に対処する必要があります。これにより、追加のエンティティ(オリジナルのものはOperator operatorで、int operatorではありません)と "magic"ロジックが表示され、新しいオペレータまたは古いオペレータでラインを作成するかどうかを決定します。

このような状況を処理するためのベストプラクティスはありますか?いくつかの実装の詳細にカップルの周り同上のクライアントを渡すのIds

を渡す

:ここ

+1

関連以外の関係は(オペレータが行を所有していない)が存在しない場合は、演算子を作成し、次のIDのいくつかの種類を使用して、それを参照する必要があり、技術的に2つのHTTP要求が発生します。 [DDD:aggregates](http://thepaulrayner.com/blog/aggregates-and-entities-in-domain-driven-design/)を参照してください。 – cdelmas

+0

良い点。私はこれに焦点を当ててワン・コール・オペレーションであり、明白な解決策を見逃していました。 – ovnia

答えて

2

はしてもしなくてもよい使用するかを決定するためにあなたを助けるかもしれない、アイデアのカップルですオブジェクト。これは一般的に避けなければならないことです。次のコードを考えてみましょう:

public Line createLine(String name, LineType lineType, int operatorId); 

呼び出し側は通常モデルの一部ではないoperatorId、知っている必要があります。 IDは、言い換えれば、オペレータが本当にIDを持っていない、それは高々を持っているが、それは実際に変更することができ、通常、持続性の単なる実装の詳細です。「正常な」オブジェクト指向コードで

、この方法ではなく、このようになります。

public Line createLine(String name, LineType lineType, Operator operator); 

参照の助けを借りて、代わりに実際のオペレーターを渡します。 RESTful HTTPのオブジェクト参照と同等のものは何ですか?もちろん、URIです。だから、に私たちを得るでしょう:

POST /lines 
{"name": "15B", "type": "BUS", "operator": "http://something/124"} 

JavaおよびHTTP APIの両方に存在するこのアプローチにはしかし、別の問題が、あります:私たちは、取得するには、オブジェクトの種類を確認することはできません。 Javaでは、オペレータがインタフェースである場合、我々はどのような実装が得られるか分からない。その実装は、例えば、私たちのデータベースにはないかもしれません。 HTTP APIについても同様です。 URIを受け入れると、そのリソースがどこから来ているのかわからない場合があります。media-typesをサポートしていない可能性もあります。

これはおそらくあなたが望むものではありません。

募集コンテキスト

これは、あなたが "ネスティング" と呼んでいます。 HTTPで

public interface Operator { 
    ... 
    Line createLine(String name, LineType lineType); 
    ... 
} 

:Javaコードを考える、これは同等です

POST /operator/123/lines 
{"name": "15B", "type": "BUS"} 

これはおそらく、オペレータが実際にラインを「所有」していない場合でも、より適切であろう。サーバは、重複した行または同様の意味規則をチェックすることができます。

ハイパーメディア

あなたは本当にラインが独立した事業体になりたい場合は、何らかの形での演算子を参照する必要があります。 IDはカップリングを導入しますが、URIがあまりにも一般的である場合、唯一の解決策はフォームを導入することです。

これは正しく実装するのが難しい場合があります。重要な点は、HTMLに似た形にすることです。クライアントに適合するオプションをハイパーメディアで提供するだけです。

このような何か:

GET /lines 
{"create": { 
    "operator": { 
     "type": "select", 
     "values": [ ... ] 
    } 
}, 
"lines": [ ... ] 
} 
関連する問題