web-dev-qa-db-ja.com

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

GET要求とPOST要求の両方をサポートするリソースがあります。サンプルリソースのサンプルコードは次のとおりです。

@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つの方法を組み合わせる方法はありますか?

62
user1120144
@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)の場合、parameter1、parameter2を渡す必要があります

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
}
85
Prabhakaran

以下は、それを達成する方法の1つであり、理想的な方法ではない場合があります。

両方のタイプのリクエストを受け入れる1つのメソッドを用意し、受け取ったリクエストのタイプを確認します。タイプが「GET」または「POST」であることがわかったら、それぞれのアクションを実行し、共通のタスクを実行する1つのメソッドを呼び出します両方のリクエストメソッド、すなわちGETとPOST。

@RequestMapping(value = "/books")
public ModelAndView listBooks(HttpServletRequest request){
     //handle both get and post request here
     // first check request type and do respective actions needed for get and post.

    if(GET REQUEST){

     //WORK RELATED TO GET

    }else if(POST REQUEST){

      //WORK RELATED TO POST

    }

    commonMethod(param1, param2....);
}
7
Jayesh
@RequestMapping(value = "/books", method = { RequestMethod.GET, 
RequestMethod.POST })
public ModelAndView listBooks(@ModelAttribute("booksFilter") BooksFilter filter,
     HttpServletRequest request) 
    throws ParseException {

//your code 
}

これは、GETとPOSTの両方で機能します。

GETの場合、pojo(BooksFilter)にリクエストパラメーターで使用している属性を含める必要がある場合

以下のような

public class BooksFilter{

private String parameter1;
private String parameter2;

   //getters and setters

URlは次のようになります

/ books?parameter1 = blah

このように、GETとPOSTの両方に使用できます

0
MPPNBD