在列表<String>上添加@NotNull或模式约束



我们如何确保列表中的单个字符串不为空/空白或遵循特定模式

@NotNull
List<String> emailIds;

我也想添加模式

@Pattern("b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b.")

但是我可以没有它。但是我绝对想拥有一个约束,这将检查列表中的任何字符串是否为空或空白。json模式看起来如何

"ids": {
      "description": "The  ids associated with this.", 
    "type": "array",
        "minItems": 1,
        "items": {
        "type": "string",
         "required" :true }
 }
"required" :true does not seem to do the job

bean验证2.0(Hibernate验证器6.0.1及更高版本)支持通过注释参数化类型的类型参数来验证容器元素。示例:

List<@Positive Integer> positiveNumbers;

甚至(尽管有点忙):

List<@NotNull @Pattern(regexp="\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b") String> emails;

参考:

  • http://beanvalidation.org/2.0/
  • https://docs.jboss.org/hibernate/stable/validator/Reference/en-us/html_single/#_with_with_code_list_code

您可以为电子邮件字符串创建一个简单的包装类:

public class EmailAddress {
    @Pattern("b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b.")
    String email;
    //getters and setters
}

然后在现有对象中标记字段@Valid

@NotNull
@Valid
List<EmailAddress> emailIds;

验证器将验证列表中的每个对象。

您不必使用任何包装程序类来验证字符串列表。只需从验证器收集中使用@EachPattern约束:

@NotNull
@EachPattern(regexp="b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b.")
List<String> values;

仅此而已。容易,对吧?有关更多信息,请参阅此答案。

在我看来,将包装器类用于对象,并对方法进行验证:

public class ListWrapper<E> {
    private List<E> list = new ArrayList<>();
    private Pattern check = /*pattern*/;
    public boolean add(E obj) {
        if (this.verify(obj)) {
            return list.add(obj);
        }
        return false;
    }
    //etc
    public boolean verify(E obj) {
        //check pattern and for null
    }

另外,只需将自定义对象用于列表

最新更新