1. ホーム
  2. spring

SpringでGETとPOSTのリクエストメソッドを組み合わせる

2023-09-18 02:18:39

質問

リソースが GETPOST のリクエストに対応します。以下は、サンプルリソースのサンプルコードです。

@RequestMapping(value = "/books", method = RequestMethod.GET)
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter, two @RequestParam parameters, HttpServletRequest request)
    throws ParseException {
        LONG CODE
}


@RequestMapping(value = "/books", method = RequestMethod.POST)
public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter, BindingResult result)
        throws ParseException {
        SAME LONG CODE with a minor difference
}

2つのメソッドのコードは、例えば変数の定義を除けば実質的に同じです。2つのメソッドを簡単に組み合わせるには method = {RequestMethod.POST, RequestMethod.GET} を使って簡単に組み合わせることができます。 if の内側で実行します。試してみましたが、うまくいきません。2つのメソッドは最後に異なるパラメータを持つからです、つまり HttpServletRequestBindingResult (その @RequestParam は必須ではありませんので POST のリクエストには必要ありません)。2つのメソッドを組み合わせる方法について何かアイデアはありますか?

どのように解決するのですか?

@RequestMapping(value = "/testonly", method = { RequestMethod.GET, RequestMethod.POST })
public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter,
        @RequestParam(required = false) String parameter1,
        @RequestParam(required = false) String parameter2, 
        BindingResult result, HttpServletRequest request) 
        throws ParseException {

    LONG CODE and SAME LONG CODE with a minor difference
}

もし @RequestParam(required = true) の場合、パラメータ1、パラメータ2を渡す必要があります。

BindingResultを使って、条件に応じてリクエストしてください。

その他の方法

@RequestMapping(value = "/books", method = RequestMethod.GET)
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,  
    two @RequestParam parameters, HttpServletRequest request) throws ParseException {

    myMethod();

}


@RequestMapping(value = "/books", method = RequestMethod.POST)
public ModelAndView listBooksPOST(@ModelAttribute("booksFilter") BooksFilter filter, 
        BindingResult result) throws ParseException {

    myMethod();

    do here your minor difference
}

private returntype myMethod(){
    LONG CODE
}