我试图在注释中包含一条动态消息,该消息根据传递给它的其他变量中的值来更改文本的主体。我设置了默认消息,但是当设置了某个指示器时,我想显示其他消息。这可能吗?
这是我的注释-
@Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) @Constraint(validatedBy = FieldMatchValidator.class) @Documented public @interface FieldMatch { Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String first(); String second(); String third() default ""; String match() default "true"; String message() default "{error.theseValuesDontMatch}"; /** * Defines several <code>@FieldMatch</code> annotations on the same element * * @see FieldMatch */ @Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { FieldMatch[] value(); } }
这是注释使用的验证器类-
public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object> { 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......... }