我正在尝试从Spring 2.0迁移到Spring 3.0。
之前我定义了一个继承自MyController
的控制器SimpleFormController
,并在onSubmit
方法中编写了一些逻辑。具有处理程序方法的所有控制器都继承自MyController
。因此,用onSubmit
MyController
编写的逻辑用于执行所有请求。
现在,当我迁移到带注释的控制器,其中我的控制器是一个简单的pojo时,我如何确保每次执行onSubmit
?一种方法是从所有控制器的所有处理程序方法中调用onSubmit
。这很麻烦。
任何人都可以建议任何可行的解决方案由于使用formBackingObject
注释@ModelAttribute
可确保调用所有请求,是不是有onSubmit
方法的类比?
答案 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也可以是一个很好的工具。