HATEOASを使用して Spring MVC 3.x RESTful サービスを実装する正しい方法に苦労しています。次の制約を考慮してください。
- ドメイン エンティティが web/rest 構造で汚染されるのは望ましくありません。
- コントローラーがビュー コンストラクトで汚染されるのは望ましくありません。
- 複数のビューをサポートしたい。
現在、私はHATEOASなしでMVCアプリをうまくまとめています。ドメイン エンティティは、ビューや Web/REST の概念が組み込まれていない純粋な POJO です。例えば:
class User {
public String getName() {...}
public String setName(String name) {...}
...
}
私のコントローラーもシンプルです。それらはルーティングとステータスを提供し、Spring のビュー解決フレームワークに委譲します。私のアプリケーションは JSON、XML、および HTML をサポートしていますが、ドメイン エンティティまたはコントローラーにビュー情報が埋め込まれていないことに注意してください。
@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping
public ModelAndView getAllUsers() {
List<User> users = userRepository.findAll();
return new ModelAndView("users/index", "users", users);
}
@RequestMapping("/{id}")
public ModelAndView getUser(@PathVariable Long id) {
User user = userRepository.findById(id);
return new ModelAndView("users/show", "user", user);
}
}
だから、今私の問題 - HATEOAS をサポートするクリーンな方法がわかりません。これが例です。クライアントが JSON 形式のユーザーを要求すると、次のようになります。
{
firstName: "John",
lastName: "Smith"
}
また、HATEOAS をサポートする場合、クライアントがオブジェクトの更新、削除などに使用できる単純な「自己」リンクを JSON に含めたいとします。また、ユーザーの友達リストを取得する方法を示す「友達」リンクがある場合もあります。
{
firstName: "John",
lastName: "Smith",
links: [
{
rel: "self",
ref: "http://myserver/users/1"
},
{
rel: "friends",
ref: "http://myserver/users/1/friends"
}
]
}
どういうわけか、オブジェクトにリンクを付けたいと思っています。コントローラーはすべて正しい URL を知っているため、これを行うのに適切な場所はコントローラー層だと思います。さらに、私は複数のビューをサポートしているので、Spring のビュー解決フレームワークで JSON/XML に変換する前に、コントローラーでドメイン エンティティを何らかの形で装飾するのが正しいと思います。これを行う 1 つの方法は、問題の POJO を、リンクのリストを含む汎用の Resource クラスでラップすることです。必要な形式に変換するには、ビューを微調整する必要がありますが、実行可能です。残念ながら、ネストされたリソースをこの方法でラップすることはできませんでした。頭に浮かぶ他のことには、ModelAndView へのリンクの追加、および生成された JSON/XML などにリンクを詰め込むための Spring のすぐに使えるビュー リゾルバーのそれぞれのカスタマイズが含まれます。私がしないこと 必要なのは、JSON/XML などを常に手作りすることです。開発中に出入りするさまざまなリンクに対応します。
考え?