带有多个错误消息的Spring Hibernate类型验证

时间:2018-08-27 11:13:33

标签: java spring hibernate hibernate-validator

我想知道这样的事情是否可能。 我有一个通用的DTO类,称为“设备”。设备拥有ID和IP。 我设置了一个内部正则表达式验证,以验证IP是否正确输入。

但是现在我要进行另一种类型的验证:“验证此IP是否被另一台设备不使用”(用于更新和创建案例)。

为此,我编写了一个自定义的面向类型的ConstraintValidator,在其中,我完成了检查是否不是具有给定IP的其他设备的任务。

但是从这一点出发,我想走得更远,并从一个ConstraintValidator获得几项检查和几条响应错误消息,并对Device对象进行随机检查。

在这一点上,我找不到是否可以重新定义验证器的错误消息。这可能吗?

2 个答案:

答案 0 :(得分:2)

您可以使用我用于自己的API的以下功能来做到这一点:

public static void setNewErrorMessage(String newErrorMessage, ConstraintValidatorContext context) {

    context.disableDefaultConstraintViolation();
    context.buildConstraintViolationWithTemplate(newErrorMessage)
            .addConstraintViolation();
}

此处的上下文对象是在任何isValid实现类的ConstraintValidator函数中传递的。

这样,您将可以执行以下操作:

if(hasError1()) {
     setNewErrorMessage(ERROR1_MESSAGE, context);
     return false;
}

if(hasError2()) {
     setNewErrorMessage(ERROR2_MESSAGE, context);
     return false;
}

答案 1 :(得分:1)

您应该使用Hibernate Bean Validation API来构建类似下面的代码。

HibernateValidatorConfiguration configuration = Validation
        .byProvider( HibernateValidator.class )
        .configure();

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
    .type( Car.class )
        .property( "manufacturer", FIELD )
            .constraint( new NotNullDef() )
        .property( "licensePlate", FIELD )
            .ignoreAnnotations( true )
            .constraint( new NotNullDef() )
            .constraint( new SizeDef().min( 2 ).max( 14 ) )
    .type( RentalCar.class )
        .property( "rentalStation", METHOD )
            .constraint( new NotNullDef() );

Validator validator = configuration.addMapping( constraintMapping )
        .buildValidatorFactory()
        .getValidator();

看看http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-programmatic-api