2013-08-01 9 views
45

Mam zasób, który obsługuje zarówno żądania GET i POST. Oto przykładowy kod dla zasobu próbki:Łączenie metod żądania GET i POST na wiosnę

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

Kod w obu metod jest praktycznie taka sama, z wyjątkiem powiedzmy zmiennej definicji. Te dwie metody można z łatwością łączyć, używając method = {RequestMethod.POST, RequestMethod.GET} i prostego if w środku. Próbowałem, ale to nie działa, ponieważ te dwie metody mają inny parametr na końcu, tj. HttpServletRequest i BindingResult (@RequestParam 's nie są wymagane i dlatego nie są potrzebne w żądaniu POST). Jakieś pomysły, jak połączyć te dwie metody?

+12

Dlaczego nie przestawiasz LONG CODE na osobną metodę? –

+0

A jeśli jest tak długo, powinieneś podzielić go na kilka krótkich metod. –

+0

Bo szukam bardziej eleganckiego i ogólnego rozwiązania. Nie sądzę, że dobrze jest mieć metodę "booksLogic", która jest jedyną rzeczą, którą nazywam dwiema metodami. –

Odpowiedz

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

jeśli @RequestParam(required = true) następnie trzeba przejść parametr1, parametr2

Zastosowanie BindingResult i poprosić je na podstawie swoich warunkach.

inny sposób

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

Czy istnieje sposób, aby znaleźć typ 'request', np.' GET' lub 'POST'? – piechuckerr

5

Poniżej znajduje się jeden ze sposobów, w jaki można to osiągnąć, może nie być idealnym sposobem.

Masz jedną metodę akceptującą oba typy żądań, a następnie sprawdź, jaki typ otrzymałeś, czy jest to typ "GET" lub "POST", kiedy się o tym dowiesz, wykonaj odpowiednie akcje i wywołanie jedną z metod wykonuje wspólne zadanie dla obu metod żądań, tj. GET i 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....); 
} 
+0

Pytam dokładnie o podpis tej wspólnej metody .. w jaki sposób może zaakceptować zarówno 'HttpServletRequest' i' BindingResult'? –

+0

Domyślnie, jeśli nie wspomnisz żadnej metody odwzorowania <@RequestMapping (value = "/ books")>, to zaakceptuje zarówno żądanie GET, jak i POST, tylko część, którą musisz sprawdzić, to BindingResult. Trzeba to zbadać. Myślę, że może obsłużyć tę część nadal trzeba sprawdzić – Jayesh

+0

można zaakceptować HttpServletRequest wewnątrz parametru. Ponadto, jeśli masz mniej danych na BindingResult, to zaakceptuj swój parametr za pomocą request.getParameter ("paramName") i sprawdź według warunków, które będą działać dla obu . (spróbuj tego, jeśli BindingResult daje ci problemy, ale inaczej będzie działało przez usunięcie mapowania RequestMethod, myślę) – Jayesh

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

//your code 
} 

Będzie to działa zarówno GET i POST.

Get jeśli pojo (BooksFilter) muszą zawierać atrybut, który używasz na żądanie parametru

jak poniżej

public class BooksFilter{ 

private String parameter1; 
private String parameter2; 

    //getters and setters 

URL powinien być jak poniżej

/książki? Parametr1 = blah

W ten sposób można go używać zarówno dla GET, jak i POST

Powiązane problemy