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}.";
...