字符串列表上的@Pattern注释

时间:2013-11-20 12:35:38

标签: java regex annotations bean-validation

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

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

@NotNull
private List<String> myListOfStrings;

由于

3 个答案:

答案 0 :(得分:2)

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

对于这种情况(你不能在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;
    }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我正在使用 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) }
    }
}