Java 带注释控制器中的动态命令类

Java 带注释控制器中的动态命令类,java,spring,spring-mvc,Java,Spring,Spring Mvc,从Spring MVC 3开始,AbstractCommandController已被弃用,因此您不能再在setCommandClass()中指定命令类。而是在请求处理程序的参数列表中硬编码命令类。比如说, @RequestMapping(method = RequestMethod.POST) public void show(HttpServletRequest request, @ModelAttribute("employee") Employee employee) 我的问题是,我正

从Spring MVC 3开始,
AbstractCommandController
已被弃用,因此您不能再在
setCommandClass()
中指定命令类。而是在请求处理程序的参数列表中硬编码命令类。比如说,

@RequestMapping(method = RequestMethod.POST)
public void show(HttpServletRequest request, @ModelAttribute("employee") Employee employee)
我的问题是,我正在开发一个通用页面,允许用户编辑通用bean,因此直到运行时才知道命令类。如果变量
beanClass
包含命令类,则使用
AbstractCommandController
,只需执行以下操作:

setCommandClass(beanClass)

由于我不能将command对象声明为方法参数,有没有办法让Spring将请求参数绑定到请求处理程序主体中的泛型bean?

command对象的实例化是Spring需要知道命令类的唯一地方。但是,您可以使用
@modeldattribute
-注释的方法覆盖它:

@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> { ... }
公共抽象类GenericController{
@请求映射(“/edit”)
公共模型和视图编辑(@modeldattribute(“t”)t t{…}
}
@控制器@RequestMapping(“/foo”)
公共类FooController扩展了GenericController{…}

你说的“通用bean”是什么意思?我指的是POJO。通常,控制器使用特定的bean作为其命令对象,但我的控制器需要使用任何直到运行时才知道其类型的bean。该类型来自服务对象。但是如果在编译时不知道该类型,您将如何在代码中使用它?您可以将其视为类似于某个基于Swing的工具中的JavaBeans属性编辑器。指定要编辑的JavaBeans类,工具将其加载到编辑器中。在我的例子中,要配置的bean列表在编译时是已知的,但我希望它们共享同一个控制器,因为为每个bean使用不同的控制器是多余的。