在对输入字段进行验证时忽略空值

时间:2017-10-26 02:17:03

标签: java validation nullable

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

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.
}

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

1 个答案:

答案 0 :(得分:0)

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

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

这使得&#34; nullness&#34;部分验证标准,因此您可以简单地添加== null || <valid>表达式。例如:

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

使用新的Java 8 Optional<>类,可以进一步选择语法来明确您的意图。以下代码说明了这一点。选择你的偏好。

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()));
     });
   }
}