2011-02-02 3 views
13

Supponiamo che io sono:Come mappare valori diversi per un parametro nello stesso @RequestMapping in Spring MVC?

@RequestMapping(params = "action=nuovoprodotto")  
    public ModelAndView nuovoProdotto(
      @RequestParam(value = "page", required = false, defaultValue = "-1") int page, 
      @RequestParam(value = "action") String action, 
      @ModelAttribute Prodotto prod, HttpSession session) 
      throws Exception { 

è possibile mappare tale richiesta a come due o tre valori di parametro "azione"?

Ho provato molti modi, come

@RequestMapping(params = "action=nuovoprodotto, action=salvaprodotto") 

o

@RequestMapping(params = "action=nuovoprodotto|salvaprodotto") 

ma non funzionano ... Se non riesco a quali sono le soluzioni, besided la scrittura di un gestore per ogni singolo combinazione di valori di parametro?

risposta

19

Prova questo:

@RequestMapping(params = {"action=nuovoprodotto","action=salvaprodotto"}) 

L'attributo params è in realtà di tipo String[], ma le annotazioni lasciate si scrive un String al posto di un singolo elemento String[], così questi due sono equivalenti:

@RequestMapping(params = {"action=nuovoprodotto"}) 

e

@RequestMapping(params = "action=nuovoprodotto") 

Riferimento:


Aggiornamento: il mio male, come si può leggere nella sezione Advanced @RequestMapping options, più params vengono combinati utilizzando e, non vuole o, in modo che non può lavorare come specificato sopra.

Quindi direi quello che devi fare è creare un metodo alias con quasi la stessa firma:

@RequestMapping(params = "action=nuovoprodotto")  
public ModelAndView nuovoProdotto(
     @RequestParam(value = "page", required = false, defaultValue = "-1") int page, 
     @RequestParam(value = "action") String action, 
     @ModelAttribute Prodotto prod, HttpSession session) 
     throws Exception { 
     // some stuff here 
} 

@RequestMapping(params = "action=salvaprodotto")  
public ModelAndView salvaProdotto(
     @RequestParam(value = "page", required = false, defaultValue = "-1") int page, 
     @RequestParam(value = "action") String action, 
     @ModelAttribute Prodotto prod, HttpSession session) 
     throws Exception { 

     return nuovoProdotto(page, action, prod, session); 
} 
+0

@ gotch4, vedere il mio aggiornamento –

+0

la soluzione che hai proposto è quella ovvia che ho finito usando. Grazie comunque per il tuo impegno :) – gotch4

3

No che non è supportato.

Un modo che potrebbe non lavoro sarebbe "prevalente" il metodo di boolean checkParameters(String[] params, HttpServletRequest request)ServletAnnotationMappingUtils

Unforunaly si tratta di un metodo statico! Quindi è necessario sovrascrivere le due Méthodes da dove viene invocato:

  • AnnotationMethodHandler.RequestMappingInfo `partite booleani (HttpServletRequest richiesta)
  • DefaultAnnotationHandlerMappingvoid validateMapping(RequestMapping mapping, HttpServletRequest request)

Ma ancora una volta senza fortuna: AnnotationMethodHandler.RequestMappingInfo è una classe interna e viene creato direttamente in un'altra classe interna (ServletHandlerMethodResolver) di AnnotationMethodHandler. Ma se si ignora anche questo, può essere possibile lavorare. (Almeno è necessario copiare l'intera classe AnnotationMethodHandlerAdapter e modificare alcune righe di codice.)

Quindi, in breve: il modo più semplice è ancora disporre di due metodi di gestione.