【问题标题】:Adding @NotNull or Pattern constraints on List<String>在 List<String> 上添加 @NotNull 或 Pattern 约束
【发布时间】:2014-04-09 14:55:19
【问题描述】:

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

@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

【问题讨论】:

  • 为什么不创建一个对象而不是字符串,并在对象创建中强制执行模式。比如说,列出 eMailIds; Class EMailInfo (String emailid) .. 检查是否有效,如果错误则返回 null;并在该类中使用方法获取 emailIds
  • 创建一个 List 的派生类,它的 add() 方法覆盖所有这些?

标签: java json validation hibernate-validator jsr


【解决方案1】:

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

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
    }

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

【讨论】:

  • 我宁愿扩展 arraylist 而不是包装它。现在,接受 List 作为参数的方法不能接受这个类
  • 对于每个人来说,这取决于我想的用例
【解决方案2】:

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

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】:

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

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

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

    【讨论】:

    • 不确定我是否会提倡使用第三方库来验证字符串列表。
    • 尤其是因为它甚至不再主动更新
    【解决方案4】:

    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;
    

    参考资料:

    【讨论】:

    • 你拯救了我的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2012-12-26
    • 1970-01-01
    • 2019-04-08
    • 2022-01-02
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多