【问题标题】:Spring forms controller generalizationSpring表单控制器泛化
【发布时间】:2011-09-13 08:44:59
【问题描述】:

为 spring mvc 应用程序制作控制器时,我必须指定
每次我想从 spring 表单传递一个新的类实例时,一个新方法:

@RequestMapping(method=RequestMethod.POST)
public String mainPost(@Valid MyClass myClass, 
        BindingResult result, Model model) {
    // do the same stuff each time here
}

所以我需要为我的应用程序中的每个可能的 MyClass 编写一个方法
可以传递给控制器​​,但所有这些方法都做同样的事情
(他们检查错误并将此对象传递给服务层)。

如何将所有这些方法合并为一个?

我相信有一些类似于以下的解决方案(不起作用):

@RequestMapping(method=RequestMethod.POST)
public <T> String mainPost(@Valid T myObject, 
        BindingResult result, Model model) {
    // check errors and pass the object myObject to a service layer
}

【问题讨论】:

    标签: java forms spring controller


    【解决方案1】:

    你不能有通用控制器方法,但你可以创建通用控制器:

    public abstract class AbstractController<T> {
        @RequestMapping(method=RequestMethod.POST) 
        public String mainPost(@Valid T myObject,
              BindingResult result, Model model) { ... } 
    }
    
    @Controller 
    @RequestMapping("/myclass")
    public class MyClassController extends AbstractController<MyClass> { ... }
    

    【讨论】:

    • 是的,它要简单得多,但我希望有一些方法可以编写控制器,让您在向模型添加一些新类时不添加更多控制器代码。当我使用这样的 AbstractController 时,当我将新类添加到模型中时,我仍然需要添加新的控制器类。
    • @tsds:如果你的泛型方法对不同的模型类使用相同的 URL 映射,它怎么知道它应该绑定哪一个?
    • 每个spring表单都有commandName参数,所以当你发布数据时spring会构造那个类的实例(在这个参数中指定),我认为这些信息对于控制器来说已经足够了但我不是很对此充满信心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多