基本クラスとして果物があり、派生サブクラスとしてリンゴとバナナがあると仮定しましょう。私は、どの URI 規則と実装が最も理にかなっているのか疑問に思っていました。これは簡単です:
GET /fruits - returns list of all fruits
GET /bananas - returns list of all bananas
GET /apples - returns list of all apples
GET /bananas/new - returns form for creating a new banana
ここで、Spring はすでに新しいオブジェクトの作成とそのすべてのパラメーターの設定を処理しているため、オブジェクトを保存する方法は次のようになります。
fruit.persist(); // same for bananas and apples
では、どのように URL を設計しますか。
POST /fruits - creates a new fruit // as generic URI ... OR
POST /bananas - creates a new banana // same for apples
一般的なアプローチの問題は、メソッドがバナナ/リンゴではなく果物としてバナナ/リンゴを保存することです。
@RequestMapping(value = "/", method = RequestMethod.POST)
private String saveFruit(@Valid Fruit fruit, Long basketId) {
Basket basket = Basket.findBasket(basketId);
fruit.setBasket(basket);
fruit.persist();
}
作成フォーム内で正しいものを設定していますが、サブクラスを使用してSpringに作成する必要があることを伝える方法がわかりませんでした(たとえば、GET /bananas/newを呼び出すとき):
uiModel.addAttribute("fruit", new Banana());
現在、リンゴとバナナを保存するための 2 つのパブリック メソッドを作成しました。
POST /bananas - create a banana
POST /apples - create an apple
次のように実装します。
@RequestMapping(value = "/", method = RequestMethod.POST)
public String saveBanana(@Valid Banana fruit) {
String basketId = this.saveFruit(fruit);
return "redirect:/basket/edit/" + basketId;
}
どういうわけか、物事をDRYでシンプルに保ちたいという私のニーズを満たしていません。また、果物を編集するときに、次のようなものを呼び出したいためです
GET /fruits/123/edit - return the edit form of a fruit
フォームフィールドを表示するロジックは、ビューによって処理されます。
/bananas/123/edit などのサブクラス コントローラーを呼び出すことも考えられます。これにより、コードがもう少し分離され、新しい果物を追加するときにファイルを変更する必要がなくなります。最善の解決策は何だと思いますか?