客户休眠验证程序消息中的访问列表索引

时间:2013-08-30 00:21:32

标签: hibernate hibernate-validator

我正在验证车辆列表,我想向用户提供描述错误的自定义消息。

我目前可以使用

NotNull.vehicle.name = 'Vehicle name has not been filled in'

然而,如果列表中有10辆车没有迹象表明哪辆车出错,我想做类似的事情

NotNull.vehicle[0].name = 'Vehicle item {index + 1}: name has not been filled in'

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

使用内置约束条件无法开箱即用。

您可以为List<Car>实现自定义约束和验证器,并自行创建约束违规及其消息。使用节点构建器API,您仍然可以将违规点设置为正确的元素:

public class CarListValidator
    implements ConstraintValidator<ValidCarList, List<Car>> {

    @Override
    public void initialize(ValidCarList constraintAnnotation) {
    }

    @Override
    public boolean isValid(List<Car> cars, ConstraintValidatorContext constraintValidatorContext) {

        boolean isValid = ...;

        if ( !isValid ) {
            int invalidIndex = ...;

            constraintValidatorContext.disableDefaultConstraintViolation();
            constraintValidatorContext
                .buildConstraintViolationWithTemplate( 
                    "name missing for car #" + invalidIndex 
                )
                    .addPropertyNode( "name" )
                    .inIterable()
                    .atIndex( invalidIndex )
                .addConstraintViolation();             
        }

        return isValid;
    }
}