【问题标题】:Bean Validation message interpolation with array constraint parameter used as variable in message带有数组约束参数的 Bean Validation 消息插值用作消息中的变量
【发布时间】:2015-06-09 14:19:30
【问题描述】:

是否可以在 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.:我的第一个问题是关于 SO。)

【问题讨论】:

  • 你真的试过了吗? Bean Validation 允许使用 EL 表达式,但是“join”实际上是 Java 8 中 String 的静态方法。所以我希望它是 ${String.join('/', lengths)},但我不确定 EL 是如何处理静态方法的。我只是试试。
  • @Hardy 感谢您的提示。我试过了,但似乎只有 a formatter bean 在表达式语言中启用。

标签: java validation bean-validation


【解决方案1】:

最终我找到了解决方案。
验证器类:

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());
  }
}

*.properties:

validation.Barcode.message = The barcode must be ${joinedLengths} character long!

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

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2017-12-02
    • 2014-02-24
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多