你能在运行时更改注释消息吗?

我正在尝试在我的注释中包含一个动态消息,该消息根据传递给它的其他变量中的值来更改文本的主体。 我设置了默认消息,但是当设置了某个指示符时,我想显示不同的消息。 这可能吗?

这是我的注释 –

@Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) @Constraint(validatedBy = FieldMatchValidator.class) @Documented public @interface FieldMatch { Class[] groups() default {}; Class[] payload() default {}; String first(); String second(); String third() default ""; String match() default "true"; String message() default "{error.theseValuesDontMatch}"; /** * Defines several @FieldMatch annotations on the same element * * @see FieldMatch */ @Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { FieldMatch[] value(); } } 

这是注释使用的validation器类 –

 public class FieldMatchValidator implements ConstraintValidator { private String firstFieldName; private String secondFieldName; private String thirdFieldName; private String match; private String message; @Override public void initialize(FieldMatch constraintAnnotation) { firstFieldName = constraintAnnotation.first(); secondFieldName = constraintAnnotation.second(); thirdFieldName = constraintAnnotation.third(); match = constraintAnnotation.match(); if(match != null && !Boolean.getBoolean(match)){ message = "error.theseValuesMustNotMatch"; } } @Override public boolean isValid(final Object value, final ConstraintValidatorContext context) { try { final Object firstObj = BeanUtils.getProperty(value, firstFieldName); final Object secondObj = BeanUtils.getProperty(value, secondFieldName); final Object thirdObj = BeanUtils.getProperty(value, thirdFieldName); final String same = BeanUtils.getProperty(value, match); boolean valid = false; if(same != null && Boolean.getBoolean(same)){ if("".equals(thirdObj)){ valid = firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj) ; } else{ valid = firstObj != null && firstObj.equals(secondObj) && firstObj.equals(thirdObj) ; } } else{ if("".equals(thirdObj)){ valid = firstObj == null && secondObj == null || firstObj != null && !firstObj.equals(secondObj) ; } else{ valid = firstObj != null && !(firstObj.equals(secondObj) && firstObj.equals(thirdObj)) ; } } return valid ; } catch (final Exception ignore) { // ignore } return true; } } 

我最感兴趣的部分是读取的代码 –

  if(match != null && !Boolean.getBoolean(match)){ message = "password.error.theseValuesMustNotMatch"; } 

这是我能够做到这一点的方式 –

 @Override public void initialize(FieldMatch constraintAnnotation) { firstFieldName = constraintAnnotation.first(); secondFieldName = constraintAnnotation.second(); thirdFieldName = constraintAnnotation.third(); match = constraintAnnotation.match(); //set a message variable on initialization if("true".equals(match)){ message = constraintAnnotation.message(); } else{ message = "{password.error.threeQuestionsSameAnswer}";} } @Override public boolean isValid(final Object value, final ConstraintValidatorContext context) { Object firstObj = null; Object secondObj = null; Object thirdObj = null; //disable existing violation message context.disableDefaultConstraintViolation(); //build new violation message and add it context.buildConstraintViolationWithTemplate(message).addConstraintViolation(); etc......... }