Bean验证消息插值,数组约束参数用作消息中的变量

MrM*_*ros 4 java validation bean-validation

是否可以在javax.validation错误消息插值中加入int数组参数?

我想验证不同长度的字符串,并开始实现自定义约束:

@Constraint(validatedBy = {BarcodeValidator.class})
public @interface Barcode {
String message() default "{validation.Barcode.message}";
  int[] lengths();
}
Run Code Online (Sandbox Code Playgroud)

验证者:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我想要一个自定义消息: 条形码必须是12/23/45字符长!

我已经想通了我可以在消息中使用注释参数,所以我想做类似的事情:

validation.Barcode.message = The barcode must be ${'/'.join(lengths)} character long!
Run Code Online (Sandbox Code Playgroud)

这样的事情是可能的还是我应该以其他方式做到这一点?

(PS:我在这里的第一个问题.)

MrM*_*ros 5

最终我找到了解决方案.
验证者类:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

的*.properties:

validation.Barcode.message = The barcode must be ${joinedLengths} character long!
Run Code Online (Sandbox Code Playgroud)

还尝试命名参数lengths,但这不起作用 - 它可能绑定到该类型int[].