【发布时间】:2013-04-30 05:13:27
【问题描述】:
我正在从 Spring 2.5 升级到 Spring 3.2。我有一个以前扩展 CancellableFormController 的 MVC 控制器。它分别声明了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() 方法中已经创建了 Command 对象(通过 formBackingObject 方法)。我可以安全地假设使用@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...
}
解决方法
请在下面查看我的 cmets 到 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
}
对于我的特殊情况来说,这似乎是一个丑陋的解决方法。
【问题讨论】:
-
在我回答之前:为什么要访问命令对象?我很确定在当前的 Spring MVC 中有一个更“自动”的解决方案 :)
-
感谢您抽出时间和精力来提问。基本上,这是继承的代码(大约 5 年前的旧版应用程序),因此确切的上下文丢失了。从我阅读的内容来看,最初的目的是检查Command对象,并读取几个属性,然后最后更新命令对象中的一些信息。现在,为什么这必须发生在 onBind() 而不是过程中的其他一些钩子方法还不是很清楚。让我们假设用户希望确保命令对象在绑定时完全更新;)你知道 Spring MVC 3 中带有注释的等效机制吗?
-
@zeroflagL - 请参阅上面的评论。
标签: java spring spring-mvc spring-mvc-initbinders