我们如何确保列表中的各个字符串不为空/空白或遵循特定模式
@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
答案 0 :(得分:8)
您不必使用任何包装类来验证字符串列表。只需使用validator-collection中的@EachPattern
约束:
@NotNull
@EachPattern(regexp="\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b.")
List<String> values;
就是这样。容易,对吗?有关详细信息,请参阅this SO答案。
答案 1 :(得分:8)
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;
参考文献:
答案 2 :(得分:5)
您可以为电子邮件字符串创建一个简单的包装类:
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;
然后验证器将验证列表中的每个对象。
答案 3 :(得分: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
}
或者,只需使用列表的自定义对象