web-dev-qa-db-ja.com

Spring MVCでRESTful削除を処理する方法

Spring MVCコントローラーでRESTful削除を正しく使用するにはどうすればよいですか?一部のアイテムを削除しようとするとブール値を返すDAOがあります。

アイテムを削除しようとしています。すべて問題なければ、項目のリストを表示するだけです(削除された項目はもう存在しません)。アイテムを削除できない場合は、詳細ページにリダイレクトして、削除できなかった理由を伝えます。

特別な応答ステータスなどが必要ですか?私のアプローチはRESTfulですか?

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model) {
    Item item = itemDao.get(id);

    // true -> can delete
    // false -> cannot delete, f.e. is FK reference somewhere
    boolean wasOk = itemDao.delete(item); 

    if (wasOk) {
        return "redirect:/items";
    }

    // will write to user which item couldn't be deleted
    model.addAttribute("item", item);
    return "items/error";
}
11
Xorty

削除に関する問題がユーザーによって修正できる場合は、これで問題ありません。ユーザーができることが何もない場合は、おそらくエラーコードのステータスがより正しいでしょう。削除の場合に想像できる唯一の失敗は、承認の失敗であり、401になります。これは、メソッド「HttpServletResponse response」にパラメーターを追加することで設定できます。コードは次のようになります。

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model, HttpServletReponse response) {
    Item item = itemDao.get(id);

    // true -> can delete
    // false -> cannot delete, f.e. is FK reference somewhere
    boolean wasOk = itemDao.delete(item); 

    if (!wasOk) {
        // will write to user which item couldn't be deleted
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        model.addAttribute("item", item);
        return "items/error";   
    }

    return "redirect:/items";
}

必要に応じて他のステータスコードを置き換えることができますが、これは一般的な考え方です。

次のようなこともできます:

    if (!wasOk) {
        throw new DataAccessException("Unable to delete item: " + item);
    }

そして、同じクラスに注釈付きのエラーハンドラーがある

@ExceptionHandler(DataAccessException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleDataAccessException(DataAccessException ex) {
    // Do some stuff
    return "errorView";
}
11
Kodi

リダイレクトではなく削除操作が成功するかどうかを示すには、 HTTPステータスコード の使用を検討する必要があります。たとえば、操作が成功したことを示す_HTTP 200 OK_(または_HTTP 204 No Content_)、およびアクセスしようとしているリソースが存在しない場合は_HTTP 404 Not Found_、削除操作の場合は_HTTP 405 Method Not Allowed_は許可されません。など。応答ステータスに基づいて、クライアントは参照されたリソース(この場合は_item/{id}_によって参照されるオブジェクト)を保持するかどうかを決定できます。

Springを使用しているので、適切な @ ResponseStatus を使用してコントローラーメソッドに注釈を付けることができます。 @ResponseStatus(value = HttpStatus.NO_CONTENT)

さらに、Spring HandlerExceptionResolveralreadyは default によっていくつかのステータスコードを提供します。

19
matsev