【问题标题】:Doing JSR-303 validation in logical order按逻辑顺序进行 JSR-303 验证
【发布时间】:2017-02-24 19:50:59
【问题描述】:

我的域模型类验证约束中有这样的字段:

@Column(nullable = false, name = "name")
    @NotEmpty(groups = {Envelope.Insert.class, Envelope.Update.class})
    @Size(min = 3, max = 32)
    private String name;

当此字段为空 ("") 或 null 时,验证器会同时生成“不能为空”和“大小必须介于...之间”的错误消息。我理解,但是当我向客户端显示此验证错误时,它似乎很奇怪(因为当某些内容为空/空时,它无法满足大小要求,这不合逻辑)。

有什么方法可以告诉 Spring 以正确的顺序进行验证吗?如果不是@NotEmpty,则不检查@Size,当满足@NotEmpty 时检查@Size

【问题讨论】:

    标签: spring validation bean-validation


    【解决方案1】:

    以下示例取自JSR-303 docs

    public class Address {
        @NotEmpty(groups = Minimal.class)
        @Size(max=50, groups=FirstStep.class)
        private String street1;
    
        @NotEmpty(groups=SecondStep.class)
        private String city;
    
        @NotEmpty(groups = {Minimal.class, SecondStep.class})
        private String zipCode;
        ...
    
        public interface FirstStep {}
    
        public interface SecondStep {}
    
        @GroupSequence({Firststep.class, SecondStep.class})
        public interface Total {}
    }
    

    并像这样调用验证器

    validator.validate(address, Minimal.class, Total.class);
    

    【讨论】:

      【解决方案2】:

      根据Hibernate official document:

      默认情况下,约束的评估没有特定的顺序,这 不管他们属于哪个群体。在某些情况下, 但是,控制约束的顺序很有用 评估。为了执行这样的命令,需要定义一个新的 接口并使用 @GroupSequence 对其进行注释,定义顺序 必须验证哪些组。

      首先,创建两个接口FirstOrder.class和SecondOrder.class,然后在OrderedChecks.java中使用@GroupSequence注解定义一个组序列。

      public interface FirstOrder {
      }
      
      public interface SecondOrder {
      }
      
      @GroupSequence({FirstOrder.class, SecondOrder.class})
      public interface OrderedChecks {
      }
      

      最后,在您的 bean 约束注释中添加组。

      @Column(nullable = false, name = "name")
      @NotEmpty(groups = {FirstOrder.class, Envelope.Insert.class, Envelope.Update.class})
      @Size(min = 3, max = 32, groups=SecondOrder.class)
      private String name;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-12
        • 2015-01-10
        • 2011-10-30
        • 2018-08-15
        • 1970-01-01
        • 2011-10-29
        • 2014-03-24
        • 2012-11-03
        相关资源
        最近更新 更多