【发布时间】:2013-11-20 12:35:37
【问题描述】:
我正在使用 javax.validation.constraints.Pattern。
我正在添加模式的 pojo 还包含一个 List 对象。 如何添加 @Pattern 注释以便检查元素?
@NotNull
private List<String> myListOfStrings;
谢谢
【问题讨论】:
标签: java regex annotations bean-validation
我正在使用 javax.validation.constraints.Pattern。
我正在添加模式的 pojo 还包含一个 List 对象。 如何添加 @Pattern 注释以便检查元素?
@NotNull
private List<String> myListOfStrings;
谢谢
【问题讨论】:
标签: java regex annotations bean-validation
见Container element constraints。使用 Bean Validation 2.0,您应该能够将约束添加到类型参数。在您的情况下,您将拥有:
@NotNull
private List<@Pattern(regexp="pattern-goes-here") String> myListOfStrings;
【讨论】:
如果您有一些自定义对象而不是 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;
}
}
【讨论】:
我正在使用 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) }
}
}
【讨论】: