2

基本クラスとして果物があり、派生サブクラスとしてリンゴとバナナがあると仮定しましょう。私は、どの 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 などのサブクラス コントローラーを呼び出すことも考えられます。これにより、コードがもう少し分離され、新しい果物を追加するときにファイルを変更する必要がなくなります。最善の解決策は何だと思いますか?

4

1 に答える 1

1

フレームワークによってリソースの設計が決定されないようにすることが非常に重要ですHTTP は、基本クラスまたはサブクラスについて何も認識せず、リソースだけを認識します。Spring フレームワークを忘れて、リソース設計で HTTP/ReSt の観点から何を得ようとしていますか?

バックエンドでの繰り返しを省くことが唯一の理由である場合/fruits/{id}、設計は外部の問題ではなく、内部の問題に基づいています。

bananaJSONとしてフォーマットされたときにリソースがリソースとは異なる表現を持っている場合apple(新しいレイアウト、異なる属性など)、IMHO、それはおそらく独自のリソースで処理する価値があります。

その決定を下したら、Spring を使用してできるだけきれいにそれを達成する方法を検討してください。

于 2012-08-03T12:27:09.723 に答える