我们如何确保列表中的单个字符串不为空/空白或遵循特定模式
@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
}
另外,只需将自定义对象用于列表