我正在使用Spring MVC 3带注释的样式控制器开发应用程序。在某些情况下,我需要根据会话变量或其他条件添加/修改某些字段值。更复杂的是,如果某些条件匹配,该字段可能具有固定值,如果不匹配则读取用户输入。问题是:有一种方法可以在绑定后修改表单,但在使用spring mvc 3进行验证之前?使用SimpleFormController(onBind方法)非常简单,但我在spring mvc 3中找不到方法。
一个例子:
a)我初始化表单的活页夹。添加验证器,设置允许字段列表,并添加通用属性编辑器列表
@InitBinder(value = COMMAND_NAME)
@Override
public void initBinder(final WebDataBinder binder, final HttpServletRequest httpServletRequest) {
binder.setValidator(reenvioAsientoValidator);
binder.setAllowedFields(ReenvioAsientoForm.getListaCamposPermitidos());
.... Add some custom property editors for booleans, integers ....
}
b)创建模型对象
@ModelAttribute(value = COMMAND_NAME)
public ReenvioAsientoForm rellenaModelo(final HttpServletRequest httpServletRequest) {
final ReenvioAsientoForm form = new ReenvioAsientoForm();
... Add some field values, which cannot be modified by user ...
return form;
}
c)发生绑定:它可以修改allowedFields列表中的任何字段。甚至那些我在阶段b)中设定的那些
d)这是我不能做的事。我需要设置/修改表单的某些字段。无法在创建模型阶段完成,因为这些字段位于allowedFields列表中(根据不同的条件,它们可以只读或接受用户输入)
e)验证发生
f)调用控制器POST方法
@RequestMapping(value = URI_REENVIO_ASIENTO, method = RequestMethod.POST)
public ModelAndView submit(@Valid @ModelAttribute(COMMAND_NAME) final ReenvioAsientoForm form, final BindingResult result, HttpServletRequest request) {
.....
}
我尝试过的事情:
答案 0 :(得分:3)
最简单的解决方法是避免使用@Valid
来触发验证。
@Autowired
Validator validator;
@RequestMapping(value = URI_REENVIO_ASIENTO, method = RequestMethod.POST)
public ModelAndView submit(@ModelAttribute(COMMAND_NAME) final ReenvioAsientoForm form, final BindingResult result, HttpServletRequest request) {
// here comes the custom logic
// that will be executed after binding and before validation
// trigger validation
validator.validate(form, result);
// handle validation result and return view name
...
}
请参阅Spring JIRA中的相关问题以及不会实现此类挂钩/注释的说明 - @MVC should provide an "onBind" hook prior to automatic validation。