【问题标题】:Spring MVC 3. How to modify the form after binding but before validationSpring MVC 3. 绑定后验证前如何修改表单
【发布时间】: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) {
    .....
}

我尝试过的一些事情:

  1. 在验证之前修改内部验证器:这是一个可能的解决方案,但我觉得它很讨厌,因为我将验证器用于不打算使用的东西。此外,它仅在表单经过验证时才有效。
  2. 使用自定义属性编辑器。这样我可以在绑定期间检查条件并设置值。问题是只有当请求中存在属性时才会触发活页夹。如果总有办法触发它,那将是一个不错的解决方案

【问题讨论】:

    标签: spring validation spring-mvc


    【解决方案1】:

    最简单的解决方法是避免使用@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

    【讨论】:

    • 谢谢你。我更喜欢后绑定的分离方法,但消除验证可能是最简单的方法。我还将查看您发布的关于 RequestMappingHandlerAdapter 的 jira 线程中提供的提示
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多