Java 如何在自定义验证批注上插入ConstraintValidator消息

Java 如何在自定义验证批注上插入ConstraintValidator消息,java,hibernate-validator,Java,Hibernate Validator,我已经阅读了一些关于如何使用Hibernate的ConstraintValidator的Q&a和指南(如),但没有一本明确提到在创建自定义验证注释时如何在验证错误消息的特定位置插入值 例如,如果我有一条如下所示的验证错误消息: foo.bar.error=This value '{myValue}' is wrong. public class SomeClass { @CustomAnnotation(message="{foo.bar.error}")

我已经阅读了一些关于如何使用Hibernate的ConstraintValidator的Q&a和指南(如),但没有一本明确提到在创建自定义验证注释时如何在验证错误消息的特定位置插入值

例如,如果我有一条如下所示的验证错误消息:

foo.bar.error=This value '{myValue}' is wrong.
public class SomeClass {

    @CustomAnnotation(message="{foo.bar.error}")
    public MyObject myObject;

    ...

}

public class MyObject {
    private String myValue;

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

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

public class CustomValueValidator 
        implements ConstraintValidator<CustomAnnotation, MyObject> {

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

    @Override
    public boolean isValid(final MyObject myObject, 
                           final ConstraintValidatorContext context) {
        boolean valid;

        // Add your validations over the 'myObject' object

        if (!valid) {
            ((ConstraintValidatorContextImpl) context)
                    .addMessageParameter("wrongValue", myObject.getMyValue());
        }

        return valid;
    }
}
如果验证失败,我希望获得以下消息:

“某些错误值”的值是错误的

验证的使用方式如下:

foo.bar.error=This value '{myValue}' is wrong.
public class SomeClass {

    @CustomAnnotation(message="{foo.bar.error}")
    public MyObject myObject;

    ...

}

public class MyObject {
    private String myValue;

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

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

public class CustomValueValidator 
        implements ConstraintValidator<CustomAnnotation, MyObject> {

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

    @Override
    public boolean isValid(final MyObject myObject, 
                           final ConstraintValidatorContext context) {
        boolean valid;

        // Add your validations over the 'myObject' object

        if (!valid) {
            ((ConstraintValidatorContextImpl) context)
                    .addMessageParameter("wrongValue", myObject.getMyValue());
        }

        return valid;
    }
}

我找到了一种不用太多模糊就插入信息的方法

首先,像以前一样设置
验证消息。属性(或存储验证消息的位置):

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 {};
}
我认为
context.unwrap(hibernateContrantValidatorContext.class)
比手动强制转换到
ConstraintValidatorContextImpl
context.unwrap(hibernateContrantValidatorContext.class).addMessageParameter(“错误值”,simpleDto.toString())