2013-08-01 12 views
45

Ich habe eine Ressource, die beide GET und POST Anfragen unterstützt. Hier ist ein Beispielcode für eine Probe Ressource:Kombinieren GET-und POST-Anfrage-Methoden in Frühjahr

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

Der Code in den beiden Verfahren ist praktisch die gleiche, mit Ausnahme lässt eine variable Definition sagen. Die zwei Methoden können leicht kombiniert werden mit method = {RequestMethod.POST, RequestMethod.GET}, und eine einfache if innen. Ich habe versucht, aber es funktioniert nicht, weil die beiden Methoden einen anderen Parameter am Ende haben, d. H. HttpServletRequest und BindingResult (die @RequestParam werden nicht benötigt und daher nicht in der POST Anfrage benötigt). Irgendwelche Ideen, wie man die zwei Methoden kombiniert?

+12

Warum verschiebst du deinen LANGEN CODE nicht in eine separate Methode? –

+0

Und wenn es so lang ist, sollten Sie es sogar in mehrere kurze Methoden teilen –

+0

Weil ich nach einer eleganteren und allgemeineren Lösung suche. Ich glaube nicht, dass es mir gut ist, eine Methode 'booksLogic' zu haben, die das einzige ist, was ich in den beiden Methoden nenne. –

Antwort

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 
} 

wenn @RequestParam(required = true) dann Sie parameter1, parameter2

Verwendung BindingResult und fordern sie auf der Grundlage Ihrer Bedingungen passieren muss.

Der andere Weg

@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

Gibt es eine Möglichkeit zu finden, welche Art von 'Anfrage', also' GET' oder 'POST' kam? – piechuckerr

5

Unten ist einer der Wege, mit denen Sie das erreichen können, möglicherweise nicht ein idealer Weg zu tun.

Haben Sie eine Methode akzeptieren beide Arten von Anfrage, dann überprüfen Sie, welche Art von Anfrage erhalten, ist es vom Typ "GET" oder "POST", sobald Sie das wissen, tun entsprechende Aktionen und die eine Methode aufrufen macht eine gemeinsame Aufgabe für beide Request-Methoden, dh GET und 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

Ich frage genau nach der Signatur dieser gebräuchlichen Methode. Wie kann sie sowohl 'HttpServletRequest' als auch' BindingResult' akzeptieren? –

+0

Wenn Sie keine Zuordnungsmethode <@RequestMapping (value = "/ books") angeben, wird standardmäßig sowohl die GET- als auch die POST-Anfrage akzeptiert, nur der zu überprüfende Teil ist BindingResult. Müssen Sie das erkunden. Ich denke, dass es mit diesem Teil noch überprüfen kann – Jayesh

+0

können Sie HttpServletRequest innerhalb Parameter akzeptieren, auch wenn Sie weniger Daten auf BindingResult dann akzeptieren Sie Ihren Parameter mit request.getParameter ("paramName") und überprüfen Sie durch Bedingungen, die für beide arbeiten würde . (Versuchen Sie dies, wenn BindingResult Ihnen Probleme gibt, sonst funktioniert es, indem Sie das RequestMethod-Mapping entfernen, denke ich) – Jayesh

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

//your code 
} 

Dieser Wille arbeitet für GET und POST.

Für GET, wenn Ihr pojo (BooksFilter) haben das Attribut enthalten, die Sie in Anfrageparameter mit

wie unten

public class BooksFilter{ 

private String parameter1; 
private String parameter2; 

    //getters and setters 

URl sein sollte wie unten

/Bücher? parameter1 = blah

So können Sie es für beide GET und POST verwenden