15

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

@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
4

4 回答 4

48

Bean 验证 2.0(Hibernate Validator 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;

参考:

于 2018-06-07T20:50:20.293 回答
11

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

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;

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

于 2014-03-06T19:11:41.647 回答
8

您不必使用任何包装类来验证字符串列表。只需使用validator-collection@EachPattern中的约束:

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

就这样。容易,对吧?有关更多信息,请参阅SO 答案。

于 2014-04-03T01:08:51.797 回答
0

在我看来,对对象使用包装类,并对方法进行自己的验证:

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
    }

或者,只需为列表使用自定义对象

于 2014-03-06T19:02:30.250 回答