Как интерполировать сообщение ConstraintValidator в пользовательской аннотации проверки - PullRequest
0 голосов
/ 23 января 2019

Я прочитал некоторые вопросы и ответы и руководства (например, Документация Hibernate ) о том, как работать с ConstrainValidator в Hibernate, но ни в одном из них не упоминается, как интерполировать значение в определенной позиции сообщения об ошибке проверки при создании собственной пользовательской аннотации проверки.

Например, если у меня есть сообщение об ошибке проверки, которое выглядит следующим образом:

foo.bar.error=This value '{value}' is wrong.

Я хотел бы получитьследующее сообщение, если проверка не пройдена:

Неверное значение 'some-value'.

Проверка будет использоваться следующим образом:

public class SomeClass {

    @CustomAnnotation(message="{foo.bar.error}")
    public SimpleDto someSimpleDto;

    ...

}

1 Ответ

0 голосов
/ 23 января 2019

Я нашел способ интерполировать сообщение без особых размышлений.

Сначала установите ValidationMessages.properties (или где хранятся ваши сообщения проверки), как и раньше:

foo.bar.error=This value '{wrongValue}' is wrong.

Создайте аннотацию, как обычно:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Constraint(validatedBy = CustomValueValidator.class)
@Target(FIELD)
@Retention(RUNTIME)
public @interface CustomAnnotation {    
    String message() default "{foo.bar.error}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

Реализуйте свой ограничитель проверки следующим образом:

import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CustomValueValidator 
        implements ConstraintValidator<CustomAnnotation, SimpleDto> {

    @Override
    public void initialize(final CustomAnnotation constraintAnnotation) {
        // Extract any value you would need from the annotation
    }

    @Override
    public boolean isValid(final SimpleDto simpleDto, 
                           final ConstraintValidatorContext context) {
        boolean valid;

        // Some validations over the simpleDto

        if (!valid) {
            ((ConstraintValidatorContextImpl) context)
                    .addMessageParameter("wrongValue", simpleDto.toString());
        }

        return valid;
    }
}

Теперь осталось только использовать аннотацию:

public class SomeClass {

    // I'm using the default message. You could override it as a parameter
    @CustomAnnotation
    public SimpleDto someSimpleDto;

    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...