0

我正在为我指定错误消息的类编写验证。一个成员是另一个也具有验证的类的对象的 List<>。我想验证该列表中的每个对象,以便椭圆返回的违规列表具有所需的信息。

例子:

class A{
    @AssertValid
    List<B> items;
}

class B{
    @NotNull(message="ID can't be null")
    Integer id;
}

现在,让我们假设我主要有这个:

A obj = new A();
List<B> items = new ArrayList<>();
items.add(new B());
a.setItems(items);
List<ConstraintViolation> violations = validator.validate(obj);
if(violations.size()>0) {
    System.out.println(violations.get(0).getMessage());
}

它将打印的是“ enet.sf.oval.constraint.AssertValid: com.A is invalid”,而不是“ ID Can't be null”。

是否有一个选项可以指定给 OVal 来验证每个项目而不是整个列表?

谢谢

4

2 回答 2

0

默认情况下,OVal 会验证列表中的项目。违规详情可通过 获得ConstraintsViolatedException#getConstraintViolations()

生成的ConstraintViolation对象有一个getCauses()方法允许您检索有关级联违规(即子对象的违规)的详细信息。

于 2016-06-24T23:28:41.877 回答
0

您可以使用自己的 MessageFormatter 来做到这一点:

public class CustomMessageValueFormatter implements MessageValueFormatter {
    public static final CustomMessageValueFormatter INSTANCE = new CustomMessageValueFormatter();

    @Override
    public String format(Object value) {
        Validator validator = new Validator();
        List<ConstraintViolation> constraintViolations = validator.validate(value);
        List<String> errorMessages = new ArrayList<>();
        constraintViolations.forEach(v -> errorMessages.add(v.getMessage()));
        return errorMessages.isEmpty() ? value.toString() : errorMessages.toString();
    }
}

class A{
    @AssertValid(message = "{invalidValue}")
    List<B> items;
}

class B{
    @NotNull(message="ID can't be null")
    Integer id;
}

在验证之前将您的自定义 MessageFormatter 设置为:

Validator.setMessageValueFormatter(CustomMessageValueFormatter.INSTANCE);
于 2016-03-07T10:39:40.893 回答