我有自定义注释,像这样:
@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 {};
}
和 validator 以验证东西:
public class MyValidator implements ConstraintValidator<MyAnnotation, String> {
@Override
public void initialize(MyAnnotation myAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
ConstraintValidatorContextImpl con = (ConstraintValidatorContextImpl)context;
String diff = getDiff(value, cleanForHTMLContext(value));
if(diff.isEmpty()){
return true;
}
return false;
}
private cleanForHTMLContext(String value) {
// Some stuff to clean up value
}
private String getDiff(String value, String cleanedValue) {
// Some stuff to compare values
}
}
我的目标是将“diff”添加到注释属性,然后可以通过 ResourceBundle 中的键和属性解析消息。
例如:当使用无效日期类型时,它应该看到以下消息:
数据无效,因为包含此文本:{diff}。其中 diff 将是两个字符串之间的运行时比较结果,将在 isValid() 方法中进行评估。
我试过像这样从映射参数中提取值:
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}.";
...
关于java - 如何覆盖 Hibernate 中验证注释中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128004/