Spring MVC 3.如何在绑定之后但在验证之前修改表单

时间:2015-10-13 17:09:23

标签: spring validation spring-mvc

我正在使用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) {
    .....
}

我尝试过的事情:

  1. 在验证之前修改内部验证器:这是一个可能的解决方案,但我发现它很讨厌,因为我正在使用验证器来实现它不打算。此外,它仅在表单经过验证时才有效。
  2. 使用CustomPropertyEditor。这样我就可以检查条件并在绑定期间设置值。问题是只有在请求中存在属性时才会触发绑定器。如果总有一些事情要解雇它,那将是一个很好的解决方案

1 个答案:

答案 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