【问题标题】:Spring Annotation Based Form Validation基于 Spring 注解的表单验证
【发布时间】:2012-06-27 23:38:44
【问题描述】:

我正在使用基于 Springs 注释的表单验证(主要是 @NotBlank 和 @Length),效果很好。我将 formbean 传递给验证方法,如下所示:

validate(formBean, result);

我有几个注释附加到各种表单字段中,除了一个之外,它们正在按预期进行验证。

我在表单 bean 中的一个字段声明如下:

private EntriesBean entries;

这个字段显然是指具有通常的 getter 和 setter 的 bean。此 bean 中的一些字段也附加了验证注释,但它们不像其他字段那样作为 validate() 方法调用的一部分进行验证。这是否与这个 bean 被另一个 bean 引用而不是直接来自调用 validate() 的方法有关?

谢谢

【问题讨论】:

    标签: java spring validation spring-mvc annotations


    【解决方案1】:

    您可以通过这种方式验证您的“条目”字段:

    @Valid
    private EntriesBean entries;
    

    这将使 Hibernate 验证器级联该 bean 中的验证

    【讨论】:

    • 这与 pushNestedPath 的做法相比如何?其中一个是不是比另一个“更好的最佳实践”?
    • 我不确定 Spring 如何使用这些方法进行验证,我给你的方法是与 HibernateValidator 一起使用,我不确定它是否适用于你的方法。我认为它会因为 @Valid 是 javax.validation 包中的标准注释。你可以看看docs.jboss.org/hibernate/validator/4.0.1/reference/en/html/…
    • 我尝试使用 javax 库中的 @Valid,但它没有触发嵌套 bean 上的验证注释。我一直坚持我目前的做法,因为我找不到使用 Spring 以任何其他方式工作的示例。
    【解决方案2】:

    回答了我自己的问题。

    阅读非常冗长的文档,我可以看到这样做的方法是使用 BindingResult 对象的 pushNestedPath() 和 popNestedPath() 方法,如下所示:

        result.pushNestedPath("entries");
        validator.validate(form.getEntries(), result);
        result.popNestedPath();
    

    我不喜欢这种方式,因为它看起来很乱,但它确实有效,它似乎

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 2013-05-14
      • 1970-01-01
      • 2011-11-06
      • 2013-01-01
      • 2011-04-08
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多