我正在使用javax.validation.constraints.Pattern。
我添加模式的pojo还包含一个List对象。 如何添加@Pattern注释以便检查元素?
@NotNull
private List<String> myListOfStrings;
由于
答案 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) }
}
}