我想验证不同长度的字符串,并开始实现自定义约束:
@Constraint(validatedBy = {BarcodeValidator.class})
public @interface Barcode {
String message() default "{validation.Barcode.message}";
int[] lengths();
}
验证者:
public class BarcodeValidator implements ConstraintValidator<Barcode, String> {
private List<Integer> lengths;
@Override
public void initialize(Barcode barcode) {
lengths = new ArrayList<>(barcode.lengths().length);
for (int l : barcode.lengths()) lengths.add(l);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && lengths.contains(value.length());
}
}
我希望收到一条自定义消息,例如:条形码必须为12/23/45个字符长!
我已经知道我可以在消息中使用批注参数,因此我想执行以下操作:
validation.Barcode.message = The barcode must be ${'/'.join(lengths)} character long!
这样的事情是否可能发生,还是我应该以其他方式来做?
(PS:我的第一个问题是关于SO的。)
最终我找到了解决方案。
验证器类:
public class BarcodeValidator implements ConstraintValidator<Barcode, String> {
private List<Integer> lengths;
@Override
public void initialize(Barcode barcode) {
lengths = new ArrayList<>(barcode.lengths().length);
for (int l : barcode.lengths()) lengths.add(l);
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
context.unwrap(HibernateConstraintValidatorContext.class).addExpressionVariable("joinedLengths", String.join(" / ", lengths));
return value != null && lengths.contains(value.length());
}
}
*。特性:
validation.Barcode.message = The barcode must be ${joinedLengths} character long!
还尝试命名该参数lengths
,但没有成功-它可能已绑定到该类型int[]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句