【问题标题】:Is it possible to run validation on demand in Spring? [duplicate]是否可以在 Spring 中按需运行验证? [复制]
【发布时间】:2018-12-10 16:04:40
【问题描述】:

我在一个 Spring 项目中遇到以下情况:我们有一堆用户表单,它们只需要按需验证。 例如,假设我有一个类 SomeUserData

class SomeUserData {
   //@NotNull
   private String firstName;

   //@NotNull
   //@Min(18)
   //@Max(100)
   private Integer age;
}

我需要能够保存用户输入的任何数据,即使他将姓名留空或将 15 岁作为年龄而不会产生任何警告。

但当用户请求此类验证时,我确实需要通过验证运行数据。

有人知道解决这个问题的方法吗?如果我没有提供足够的详细信息,请告诉我。

【问题讨论】:

  • 为什么在用户请求之前数据的有效性并不重要?
  • @Kayaman 业务需求。要求保存每个输入而不进行验证,并有一个特定的操作来验证。所以基本上你可以保存一个草稿版本,即使它充满了错误,并在你准备好时进行诊断。

标签: java spring


【解决方案1】:

我建议为此使用不同的类:SomeUserData 和 SomeUserDataStrict。此外,您可以有不同的验证集,如成熟度评级(如美国电影协会电影评级系统):SomeDataG、SomeDataPG、SomeDataPG13、SomeDataR、SomeDataNC17

【讨论】:

    【解决方案2】:

    编写自定义验证器,例如,该验证器的验证方法有一个可选的布尔参数,例如“validateBusiness”。如果该参数存在并设置为 TRUE 则执行验证,否则保存实体而不进行验证。

    【讨论】:

      【解决方案3】:

      要有条件地验证您的类对象,您可以在您的类中添加一个字段 Let say validateOnDemand 布尔字段。

      class SomeUserData {
         private String firstName;
         private Integer age;
         private boolean validateOnDemand;
      
      }
      

      然后使用@AssertTrue on 方法,该方法将具有您的条件验证逻辑

      @AssertTrue
      public boolean validateFirstNameOnDemand() {
         if(this.validateOnDemand){
            // your logic to validate/invalidate 
         }else{
           return true; // validate 
         }
      }
      

      如果上述方法返回true,则请求对象被验证,否则如果返回false,如果传入@AssertTrue参数,它将抛出带有消息的AssertionException

      【讨论】:

        猜你喜欢
        • 2022-12-21
        • 2013-11-30
        • 2015-12-25
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 2013-04-07
        • 1970-01-01
        相关资源
        最近更新 更多