Java 如何在Hibernate中覆盖validate注释中的属性?

Java 如何在Hibernate中覆盖validate注释中的属性?,java,spring,hibernate,validation,Java,Spring,Hibernate,Validation,我有自定义注释,如下所示: @Documented @Constraint(validatedBy = MyValidator.class) @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String message() default "message";

我有自定义注释,如下所示:

@Documented
@Constraint(validatedBy = MyValidator.class)
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String message() default "message";

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

    Class<? extends Payload>[] payload() default {};
}
ConstraintValidatorContextImpl con = (ConstraintValidatorContextImpl)context;
con.getConstraintDescriptor().getAttributes().put("diff", value);
但不幸的是,对于在
ConstraintDescriptorImpl


是否有其他可能添加自定义属性,然后使用错误代码解决这些问题?

我自己也尝试过,如果您使用Hibernate Validator,下面的解决方案会起作用。注意:您的消息必须包括标记可变部分的
${}
,而不是
{}

private MyAnnotation annotation;

@Override
public void initialize(MyAnnotation a)
{
    this.annotation = a;
}

@Override
public boolean isValid(String value, ConstraintValidatorContext ctx)
{
    String diff = getDiff(value, cleanForHTMLContext(value));
    if (diff.isEmpty())
        return true;

    String message = annotation.message();
    HibernateConstraintValidatorContext hctx = ctx.unwrap(HibernateConstraintValidatorContext.class);

    ctx.disableDefaultConstraintViolation();
    ctx.addExpressionVariable("diff", diff)
       .buildConstraintViolationWithTemplate(message)
       .addConstraintViolation();
    return false;
}
注意:您的消息应该包含作为模板的
${diff}
,而不是
{diff}

...
public @interface MyAnnotation {
    String message() default "Data invalid, because contain this text: ${diff}.";
...

谢谢你的回答。但是,我已经试过了,但是忘了具体说明。不幸的是,这在我的情况下不起作用。我处理BindingResult对象的主要困难是,该对象随后转换为CustomObject,以便在客户端具有解析消息的可能性。当我尝试使用MyCustomAnnotation消息验证对象时,“数据无效,因为包含此文本:{diff}.”将设置为该对象的defaultMessage字段。在这种情况下,我不知道何时从该字段中提取消息。例如,当字段通过长度hibernate注释验证时,它将自动将默认消息设置为BindingResult。我扩展了答案以包含完整的
isValid()
方法。希望这能让事情变得更清楚。我不知道更换模板的“正确”方法,但包括了一个替代(更清洁)方法的建议,该方法可能有效,也可能无效。我更改了答案。它现在包含了使用Hibernate框架替换模板的正确方法。不幸的是,它也不适用于我,因为此功能用于解析Hibernate端带有属性的消息,如果我错了,请纠正我。我的目标是在SpringBindingResult对象中分别拥有属性和错误键,因为这些东西将在客户端解决。
...
public @interface MyAnnotation {
    String message() default "Data invalid, because contain this text: ${diff}.";
...