Подтвердить что ты не робот

Объедините методы запроса GET и POST в Spring

У меня есть ресурс, который поддерживает запросы 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
}

Код в двух методах практически одинаковый, за исключением того, что позволяет сказать определение переменной. Эти два метода можно легко объединить с помощью method = {RequestMethod.POST, RequestMethod.GET} и простого if внутри. Я попытался, но это не сработало, потому что у обоих методов есть другой параметр в конце, т.е. HttpServletRequest и BindingResult (@RequestParam не требуются и поэтому не нужны в запросе POST). Любые идеи о том, как объединить два метода?

4b9b3361

Ответ 1

@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
}

if @RequestParam(required = true), тогда вы должны передать параметр1, 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
}

Ответ 2

Ниже приведен один из способов, которым вы можете достичь этого, не может быть идеальным способом.

Попросите один метод принять оба типа запроса, затем проверьте, какой тип запроса вы получили, это тип "GET" или "POST", как только вы узнаете, что выполняете соответствующие действия и вызываете один метод, который делает общая задача для обоих методов запроса: 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....);
}

Ответ 3

@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 должен быть как ниже

/книги? Параметр1 = л

Таким образом, вы можете использовать его как для GET, так и для POST