迁移到Spring Annotated Controllers和传统的onSubmit方法

时间:2011-05-09 11:18:27

标签: java spring-mvc

我正在尝试从Spring 2.0迁移到Spring 3.0。

之前我定义了一个继承自MyController的控制器SimpleFormController,并在onSubmit方法中编写了一些逻辑。具有处理程序方法的所有控制器都继承自MyController。因此,用onSubmit MyController编写的逻辑用于执行所有请求。

现在,当我迁移到带注释的控制器,其中我的控制器是一个简单的pojo时,我如何确保每次执行onSubmit?一种方法是从所有控制器的所有处理程序方法中调用onSubmit。这很麻烦。

任何人都可以建议任何可行的解决方案由于使用formBackingObject注释@ModelAttribute可确保调用所有请求,是不是有onSubmit方法的类比?

3 个答案:

答案 0 :(得分:1)

如果要在任何带注释的控制器的每次调用之前执行相同的操作,可以使用拦截器。你可以通过实现preHandle方法编写自己的拦截器。 然后,您需要在DefaultAnnotationHandlerMapping或用于调度到控制器的任何Handler映射中注册此拦截器。 本文将介绍注册拦截器: http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors

答案 1 :(得分:0)

注释要调用的方法。方法签名非常灵活。看一下@RequestMapping的文档

@RequestMapping(value={"/foo"}, method=RequestMethod.POST)
public String myMethod(many options for parameters) {...

答案 2 :(得分:0)

好的,如果我理解正确,你希望继承在控制器处理请求时继续在堆栈中扮演角色。您可以在@RequestMapping带注释的POJO中扩展任何类,但是您必须定义一个@override方法来注释它。您所做的一切基本上都是使用覆盖方法中的参数调用super。如果扩展带注释的类并且两者都被声明为Controller,那么您将获得一个异常,因为路由将被定义多次一次。

看起来像这样

public class Pojo{

    public String someBaseMethod(){
        return "";
    }
}

@Controller
public class ChildController extends Pojo {

    @Override
    @RequestMapping("/do_it")
    public String someBaseMethod() {
        return super.someBaseMethod();
    }
}

可以使用组合而不是继承来建立一个很好的案例。我甚至建议您使用过滤机制,如果它可以应用于执行常见操作。 AOP也可以是一个很好的工具。