【发布时间】:2015-10-13 17:09:23
【问题描述】:
我正在使用 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) {
.....
}
我尝试过的一些事情:
- 在验证之前修改内部验证器:这是一个可能的解决方案,但我觉得它很讨厌,因为我将验证器用于不打算使用的东西。此外,它仅在表单经过验证时才有效。
- 使用自定义属性编辑器。这样我可以在绑定期间检查条件并设置值。问题是只有当请求中存在属性时才会触发活页夹。如果总有办法触发它,那将是一个不错的解决方案
【问题讨论】:
标签: spring validation spring-mvc