【问题标题】:Ignore null values while doing validation of input fields在验证输入字段时忽略空值
【发布时间】:2017-10-26 02:17:03
【问题描述】:

我有一个包含以下元素的类:

public class Details {
    private String locale;
    private String url;
    .
    .
    .
}

现在我从我的客户那里收到了一份清单。我想对这些元素进行一些验证。然而,所有元素都不是必须的(null 是可以接受的)。

List<Details> detailsList;

Validate.notNull(detailsList);
for(Details details: detailsList) {
    if(details.getLocale() != null) {
        Validate.isTrue(StringUtils.isNotBlank(LocaleUtils.toLocale(details.getLocale()).getVariant()));
    }
    if(details.getUrl() != null) {
        Validate.isTrue(urlValidator.isValid(details.getUrl()));
    }
    //Similarly perform null checks and then do the validation.
}

我是否有更好的方法来编写此验证,而不是为每个字段编写空检查?

【问题讨论】:

  • 使用 JSR-303 验证?

标签: java validation nullable


【解决方案1】:

只是从您的代码中获取Locale 示例,我的理解是:

  • 可以接受空值
  • 但如果它不为空,那么它必须是带有变体的有效Locale

这使得“nullness”成为验证标准的一部分,因此您可以简单地在前面加上 == null || &lt;valid&gt; 表达式。例如:

Validate.isTrue(details.getLocale() == null || StringUtils.isNotBlank(...));

使用新的 Java 8 Optional&lt;&gt; 类,可以进一步选择语法以明确您的意图。下面的代码说明了这一点。选择您的偏好。

import org.apache.commons.lang3.*;

public class OptionalTest {

  public static class TestObject1 {
    String locale;
    public TestObject1(String locale) {
      this.locale = locale;
    }
  }

  public static class TestObject2 {
    Optional<String> locale;
    public TestObject2(String locale) {
      this.locale = Optional.ofNullable(locale);
    }
  }

   public static void main(String[] args) {
     validate1(new TestObject1("en_GB_EURO"));
     validate1(new TestObject1(null));

     validate2(new TestObject2("en_GB_EURO"));
     validate2(new TestObject2(null));

     validate3(new TestObject2("en_GB_EURO"));
     validate3(new TestObject2(null));
   }

   private static void validate1(TestObject1 to) {
     Validate.isTrue(to.locale == null || StringUtils.isNotBlank(LocaleUtils.toLocale(to.locale).getVariant()));
   }

   private static void validate2(TestObject2 to) {
     Validate.isTrue(!to.locale.isPresent() || StringUtils.isNotBlank(LocaleUtils.toLocale(to.locale.get()).getVariant()));
   }

   private static void validate3(TestObject2 to) {
     to.locale.ifPresent(loc -> {
       Validate.isTrue(StringUtils.isNotBlank(LocaleUtils.toLocale(loc).getVariant()));
     });
   }
}

【讨论】:

    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2011-04-25
    • 2020-06-20
    相关资源
    最近更新 更多