具有数组约束参数的 Bean 验证消息插值用作消息中的变量
Bean Validation message interpolation with array constraint parameter used as variable in message
是否可以在 javax.validation 错误消息插值中加入 int 数组参数?
我想验证一个字符串的不同可能长度和
我开始实施自定义约束:
@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!
这样的事情可行吗?我应该用其他方式吗?
(P.S.: 我的第一个问题。)
最终我找到了解决办法。
验证者 class:
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[]
。
是否可以在 javax.validation 错误消息插值中加入 int 数组参数?
我想验证一个字符串的不同可能长度和 我开始实施自定义约束:
@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!
这样的事情可行吗?我应该用其他方式吗?
(P.S.: 我的第一个问题。)
最终我找到了解决办法。
验证者 class:
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[]
。