Я нашел способ интерполировать сообщение без особых размышлений.
Сначала установите 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;
...
}