2010-10-09 60 views
5

在Spring MVC 3,AbstractCommandController是被反對的,所以你可以不再setCommandClass()指定命令類。而是在請求處理程序的參數列表中硬編碼命令類。例如,動態命令類的註釋控制器

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

我的問題是,我正在開發一個通用的頁面,允許用戶編輯通用豆,因此命令類是不知道,直到運行時。如果變量beanClass持有的命令類,有AbstractCommandController,您只需做到以下幾點,

setCommandClass(beanClass) 

由於我不能宣佈命令對象作爲方法的參數,是有什麼辦法可以讓Spring綁定請求參數到請求處理程序正文中的泛型bean?

+0

你是什麼意思的「通用豆」嗎? – skaffman 2010-10-09 18:00:25

+0

我的意思是POJO。通常情況下,控制器使用特定的bean作爲它的命令對象,但是我的控制器需要使用直到運行時才知道類型的bean。該類型來自服務對象。 – 2010-10-09 18:13:00

+0

但是如果在編譯時不知道類型,你將如何在代碼中使用它? – skaffman 2010-10-09 20:18:19

回答

6

實例化的命令對象就是春天需要知道一個命令類的唯一地方。但是,您可以用@ModelAttribute -annotated方法來覆蓋它:

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

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

順便說一句,Spring還正常工作與真正的仿製藥:

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

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