2013-08-01 11 views
45

Ho una risorsa che supporta sia le richieste GET e POST. Ecco un codice di esempio per una risorsa di esempio:Combina metodi di richiesta GET e POST in primavera

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

Il codice nei due metodi è praticamente la stessa, tranne che per permette di dire una definizione variabile. I due metodi possono essere facilmente combinati utilizzando method = {RequestMethod.POST, RequestMethod.GET} e un semplice if all'interno. Ho provato, ma non funziona, perché i due metodi hanno un parametro diverso alla fine, ovvero HttpServletRequest e BindingResult (gli @RequestParam non sono necessari e pertanto non sono necessari nella richiesta POST). Qualche idea su come combinare i due metodi?

+12

Perché non sposti il ​​tuo LONG CODE in un metodo separato? –

+0

E se è così lungo, dovresti dividerlo in diversi metodi brevi –

+0

Perché sto cercando una soluzione più elegante e generale. Non penso di essere bravo ad avere un metodo 'booksLogic' che è l'unica cosa che chiamo nei due metodi. –

risposta

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 
} 

se @RequestParam(required = true) allora si deve passare parametro1, parametro2

Usa BindingResult e chiedere loro in base alle proprie condizioni.

L'altro modo

@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

C'è un modo per trovare quale tipo di 'request' i.e' GET' o 'POST' è arrivato? – piechuckerr

5

Di seguito è uno dei modi con cui è possibile ottenere ciò, potrebbe non essere un modo ideale per fare.

Avere un metodo che accetta entrambi i tipi di richiesta, quindi verificare quale tipo di richiesta è stata ricevuta, è di tipo "GET" o "POST", una volta venuto a saperlo, fare le rispettive azioni e il metodo call one che svolge un compito comune per entrambi i metodi di richiesta, ad esempio GET e 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

Sto chiedendo esattamente la firma di quel metodo comune .. come può accettare sia 'HttpServletRequest' che' BindingResult'? –

+0

Per impostazione predefinita, se non si menziona alcun metodo di mappatura <@RequestMapping (value = "/ books")>, allora accetta sia la richiesta GET che POST, solo la parte che è necessario verificare è BindingResult. Bisogno di esplorarlo. Penso che sia in grado di gestire quella parte ancora bisogno di controllare – Jayesh

+0

è possibile accettare HttpServletRequest all'interno del parametro, Inoltre, se si dispone di meno dati su BindingResult quindi accettare il parametro utilizzando request.getParameter ("paramName") e verificare condizioni che funzionerebbero per entrambi . (prova questo se BindingResult ti sta dando dei problemi allora solo altrimenti funzionerà rimuovendo la mappatura RequestMethod che penso) – Jayesh

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

//your code 
} 

Questa volontà funziona sia per GET e POST.

Per ottenere se il tuo POJO (BooksFilter) devono contenere l'attributo che si sta utilizzando in richiesta parametro

come qui di seguito

public class BooksFilter{ 

private String parameter1; 
private String parameter2; 

    //getters and setters 

URL dovrebbe essere come sotto

/libri? parametro1 = blah

piace questo modo u possibile utilizzarlo sia per GET e POST

Problemi correlati