2010-10-09 6 views
5

Od wiosny MVC 3, AbstractCommandController jest przestarzałe, więc nie można już określać klasy polecenia w setCommandClass(). Zamiast tego należy zakodować klasę poleceń na liście parametrów procedury obsługi żądań. Na przykład,Klasa poleceń dynamicznych w kontrolerach z przypisanymi komentarzami

@RequestMapping(method = RequestMethod.POST) 
public void show(HttpServletRequest request, @ModelAttribute("employee") Employee employee) 

Moim problemem jest to, że Zajmuję rodzajowe stronę, która pozwala użytkownikowi na edycję rodzajowe fasoli, więc klasa komenda nie jest znana aż do czasu wykonywania. Jeśli zmienna beanClass posiada klasę poleceń, z AbstractCommandController, byś po prostu wykonaj następujące czynności,

setCommandClass(beanClass) 

Ponieważ nie mogę zadeklarować obiekt polecenia jako parametr metody, czy jest jakiś sposób, aby mieć parametry żądania Wiosna powiązań do ogólnej fasoli w treści obsługi żądania?

+0

Co masz na myśli przez „generycznego fasoli”? – skaffman

+0

Miałem na myśli POJO. Zwykle kontroler używa określonego komponentu bean jako obiektu polecenia, ale mój kontroler musi używać dowolnego komponentu bean, którego typ nie jest znany do czasu wykonania. Typ pochodzi z obiektu usługi. –

+0

Ale jeśli typ nie jest znany w czasie kompilacji, w jaki sposób zamierzasz go użyć w swoim kodzie? – skaffman

Odpowiedz

6

Utworzenie obiektu polecenia jest jedynym miejscem, w którym Spring musi znać klasę poleceń. Jednak można go nadpisać @ModelAttribute -annotated metody:

@RequestMapping(method = RequestMethod.POST) 
public void show(HttpServletRequest request, 
    @ModelAttribute("objectToShow") Object objectToShow) 
{ 
    ... 
} 

@ModelAttribute("objectToShow") 
public Object createCommandObject() { 
    return getCommandClass().newInstance(); 
} 

przy okazji, Wiosna działa też dobrze z rzeczywistych rodzajowych:

public abstract class GenericController<T> { 
    @RequestMapping("/edit") 
    public ModelAndView edit(@ModelAttribute("t") T t) { ... } 
} 

@Controller @RequestMapping("/foo") 
public class FooController extends GenericController<Foo> { ... } 
Powiązane problemy