我正在从 Spring 2.5 升级到 Spring 3.2。我有一个以前扩展的 MVC 控制器CancellableFormController
。它分别声明initBinder()
和onBind()
方法。我已将 Controller 重构为使用@Controller
注释,并将覆盖的initBinder()
方法切换为使用 Spring MVC 3 注释@initBinder
。
我的具体问题是,在 Spring MVC 3 中,从 Spring 2.5 升级,如何重构被覆盖的onBind()
方法以使用等效的注解?现有方法的签名是:
@Override
protected void onBind(HttpServletRequest request, Object command, BindException errors) throws Exception {
MyCommand cmd = (MyCommand) command;
....
}
我考虑过使用@initBinder()
并将之前的代码onBind()
放在这个带注释的方法中。但我的困惑是:
- 这样做,会不会像以前一样在整个框架过程中同时调用代码?
- 如何从带
@initBinder
注释的方法中获取 Command 对象的句柄。
我可以将它声明为方法签名中的另一个参数,Spring MVC 框架将确保我得到一个副本吗?似乎在旧onBind()
方法中已经(通过formBackingObject
方法)创建了 Command 对象。我可以安全地假设使用@initBinder
方法时也是如此吗?
谢谢大家的一些见解。我正在尝试跟上 Spring MVC 流程的速度!
我现有的@initBinder
方法签名是这样的:
@InitBinder
protected void initBinder(WebDataBinder binder) {
// register custom editor here.. etc
}
我希望我可以做类似的事情:
@InitBinder
protected void initBinder(WebDataBinder binder, MyCommand cmd) {
// register custom editor here.. etc
}
这是使用注释升级cancellableformcontroller onBind() 方法的标准最佳实践方法吗?
根据标记为正确的答案进行尝试,但仍然无法正常工作:
@InitBinder("myCommand")
protected void onBind(WebDataBinder binder) throws Exception {
MyCommand cmd = (MyCommand) binder.getTarget();
.... // do whatever was required here...
}
解决方法
请参阅下面我对 zeroflag 的评论。创建一个与 onBind() 中包含的逻辑相同的私有方法,然后在 onSubmit() 注释方法 (POST / GET) 中验证命令对象后,调用现已失效的 onBind() 方法,将您的命令对象作为范围。类似于以下内容:
@RequestMapping(method=RequestMethod.POST)
public ModelAndView onSubmit(@ModelAttribute("myCommand") MyCommand cmd, BindingResult result, <any other params> {
new MyCommandValidator().validate(cmd, result);
if (result.hasErrors()) {
return new ModelAndView("context");
}
onBind(cmd, <any other params>);
... // do business stuff
}
对于我的特定情况,这似乎是一个丑陋的解决方法。