2011-02-02 12 views
13

Załóżmy, że mam:Jak mapować różne wartości dla parametru w tym samym @RequestMapping w 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 { 

to możliwe, aby ten wniosek do map jak dwa lub trzy wartości parametru „działania”?

Próbowałem wiele sposobów jak

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

lub

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

ale one nie działają ... Jeśli nie mogę jakie są rozwiązania, besided pisania programu obsługi dla każdego kombinacja wartości parametrów?

Odpowiedz

19

Spróbuj tego:

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

Atrybut params jest rzeczywiście typu String[], ale adnotacje pozwalają napisać String zamiast pojedynczego elementu String[], więc te dwa są równoważne:

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

i

@RequestMapping(params = "action=nuovoprodotto") 

referencyjny:


Aktualizacja: mój zły, jak można przeczytać w sekcji Advanced @RequestMapping options wielokrotne params są łączone za pomocą, a nie czy, tak że nie może działają jak określono powyżej.

Więc powiedziałbym, co trzeba zrobić, to stworzyć metodę alias z prawie tego samego podpisu:

@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 w prawo, zobacz moją aktualizację –

+0

zaproponowane rozwiązanie jest oczywiste, z którego skorzystałem. Dzięki dla ciebie za wysiłek :) – gotch4

3

Nie, to nie jest obsługiwany.

Jednym ze sposobów, które mogą nie praca będzie „nadrzędne” metoda boolean checkParameters(String[] params, HttpServletRequest request) z ServletAnnotationMappingUtils

Unforunaly to statyczny metoda! Więc trzeba zastąpić dwa methodes skąd jest wywoływana:

  • AnnotationMethodHandler.RequestMappingInfo `logicznych mecze (HttpServletRequest request)
  • DefaultAnnotationHandlerMappingvoid validateMapping(RequestMapping mapping, HttpServletRequest request)

Ale znowu bez powodzenia: AnnotationMethodHandler.RequestMappingInfo jest wewnętrzną klasy i jest tworzony bezpośrednio w innej klasie wewnętrznej (ServletHandlerMethodResolver) z AnnotationMethodHandler. Ale jeśli to też zastąpisz, możliwe będzie działanie. (Przynajmniej musisz skopiować całą klasę AnnotationMethodHandlerAdapter i zmienić jakiś wiersz kodu.)

Podsumowując: Najłatwiejszy sposób to nadal mieć dwie metody obsługi.

Powiązane problemy