【问题标题】:@Pattern annotation on List of Strings字符串列表上的@Pattern 注释
【发布时间】:2013-11-20 12:35:37
【问题描述】:

我正在使用 javax.validation.constraints.Pattern。

我正在添加模式的 pojo 还包含一个 List 对象。 如何添加 @Pattern 注释以便检查元素?

@NotNull
private List<String> myListOfStrings;

谢谢

【问题讨论】:

    标签: java regex annotations bean-validation


    【解决方案1】:

    Container element constraints。使用 Bean Validation 2.0,您应该能够将约束添加到类型参数。在您的情况下,您将拥有:

    @NotNull
    private List<@Pattern(regexp="pattern-goes-here") String> myListOfStrings;
    

    【讨论】:

      【解决方案2】:

      如果您有一些自定义对象而不是 String,则使用 @Valid 注释 List 并在自定义对象中表达规则就可以了。

      对于这种情况(您不能在 String 类中表达验证)我相信最好的机会是自定义验证器在字符串列表上应用模式:

      @NotNull
      @ListPattern("regexp")
      private List<String> myListOfStrings;
      

      注释大致如下:

      @Constraint(validatedBy=ListPatternValidator.class)
      @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
      @Retention(RUNTIME)
      public @interface ListPattern {
          ... // standard stuff
      }
      

      验证器:

      public class ListPatternValidator
          implements ConstraintValidator<ListPattern, List<?>> {
      
          public void initialize(ListPattern constraintAnnotation) {
              // see Pattern implementation
          }
      
          public boolean isValid(List<?> value, ConstraintValidatorContext context) {
              for( Object o : value ) {
                  if( does not match ) return false;
              }
              return true;
          }
      }
      

      【讨论】:

        【解决方案3】:

        我正在使用 kotlin,而 mark_o 答案在我的情况下不起作用。按照 Nikos 的回答,我的整个自定义实现是:

        @Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER)
        @Retention
        @Constraint(validatedBy = [ListPatternValidator::class])
        annotation class ListPattern(val message: String = "Invalid input",
                                     val regexp: String,
                                     val groups: Array<KClass<*>> = [],
                                     val payload: Array<KClass<out Payload>> = [])
        
        class ListPatternValidator : ConstraintValidator<ListPattern, List<String>> {
        
            var pattern: String? = null
        
            override fun initialize(constraintAnnotation: ListPattern) {
                pattern = constraintAnnotation.regexp
            }
        
            override fun isValid(values: List<String>, context: ConstraintValidatorContext): Boolean {
                val regex = pattern?.toRegex() ?: return false
                return values.all { regex.matches(it) }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 2010-10-22
          • 2011-06-18
          • 2011-09-29
          • 2013-08-05
          • 2015-04-11
          • 1970-01-01
          相关资源
          最近更新 更多