2017-01-13 8 views
0

私はこの問題のチュートリアルが見つからないので、簡単にしようと思う、それはREST APIを設計するベストプラクティスに属すると思う。役割(ID、名前) - -Spring POST json entities

私は2つのエンティティ 持っているユーザー(ID、名前、役割など)を

それを行うための最善の方法は何か、いくつかのコントローラにPOSTリクエストを作り、 jsonのやり方で

{ 
"id": 1, 
"name": "Luis", 
"rol":{ 
"id": 1, 
"name":Administrator, 
"users" : [ 
//I think this is for the bidirectional relationship so 
can I avoid this property as well?? 
] 
}, 
"another" : bla bla bla 
} 

このアプローチでは、関連するエンティティのすべてのプロパティを配置する必要がありますか?私はこの構造を持つjsonを作成しなければならないということを意味します。ここでは質問は私の頭から出ます。Springはこれがエンティティであることを知っているので、Roleオブジェクトを作成し、

それとも私はこのような投稿をしなければならない:

{ 
    "id": 1, 
    "name": "Luis", 
    "role_id" : 1, 
    "another" : bla bla bla 
    } 

だからこの程度コントローラknwosは、まずそれが使用して役割を見つけるとき、(Role.findByIdを言うことができます)もちろん、私はサービスを利用レイヤーを作成し、それをユーザーに添付します。

これにはどのような方法が最適ですか?

ありがとうございます。

答えて

0

私の意見では、この質問は非常に一般的な開発者の落とし穴、すなわち設計と実装の境界を理解していることを思い出すため、特に興味深いです。

最初に、非常に重要な概念を指摘しておきます。あなたのAPIはビジネスオブジェクトから切り離されています。あなたのAPIは、JavaやSpringについて何も知らず、あなたのUserクラスまたはRoleクラスのことをあまり気にしない建築家によって設計されています。

RESTでは、サーバーとクライアントがリソースの表現を交換します。これは、サーバーがそのリソースの最も意味のある表現を自由に判断できることを意味します。言い換えれば、JSON、XMLなどを使用しているかどうかにかかわらず、バッキングオブジェクトに何らかの形で存在するという理由だけで、APIにいくつかの情報を含める必要はありません。

APIで公開されているリソースは別の次元で公開されています。彼らはSpringのコントローラに関しては無関心です。

したがって、あなたの質問に対する答えは、その操作に意味のある情報をに送信してください。サーバーは残りの部分を知っています。

私はあなたの2番目の質問 "これはエンティティであることを知っているので、ロールオブジェクトを作成してユーザーとの関係を作ることができますか?私は少し奇妙に聞こえる。 Spring Controllers HTTPリクエストをクラスメソッドにバインドします。これらの方法は、あなたが右のURLにPOSTを発射するときに、要求があなたのControllercreateUser方法に最終的にあなたのDispatcherServletにASから派遣され、以下の

@RequestMapping(value = "/users", method = RequestMethod.POST) 
public String createUser(@RequestBody UserModel user) { 
    //... 
} 

のようなものです。ペイロード、すなわちJSON表現は、ユーザ表現に応じて定義されたUserModelクラス(例えば、id,nameおよびroleIdを含む)に非整列化されるようになりました。この時点では、必要なすべての操作を実行するためにuserが利用できるようになって以来、すべてを管理しています。おそらく、RoleオブジェクトとUserオブジェクトを作成し、2つのクラス間の依存関係を満たし、DAOやwhatheverを呼び出し、持続レイヤーが操作を完了するのを待って201 created HTTPステータスをクライアントに返します(locationヘッダーが埋め込まれています) 、あなたがRESTfulになりたい場合)。

+0

偉大な説明...私はこの方法を持つ、ユーザー内のロールオブジェクトを渡すときにすることを意味し、スプリングが知っているかの質問...について: ' 「役割」:{ 「ID」:1 } を' 又はこのよう ' "役割":{ "名前": "管理者" } ' あるいは ' "ROL":{ "ID":1、 "名前":管理者、 "users":[ ] } すべてのプロパティを取得してから、どのロールが話しているかを知るようにマップしますか?つまり、ById、ByName、ByAnyOtherPropertyをフェッチしますか? –

+0

あなたはその時点でコントローラにいて、そこに書いたコードを実行します。だから、あなたが好きな戦略を使って、Springが何かを取得するのではなく、あなたの*その時点でsaveUserが実行されていることに注意してください。おそらく、ロールを決定する属性を探してUserModelインスタンスを調べるでしょう。 IDの場合は、IDでフェッチを実行します。別の表現を使用する場合は、別のフェッチ戦略を使用します。 – MaVVamaldo