2011-05-18 15 views
14

Ek notuma, iletilen diğer değişkenlerde bulunan değerlere göre metnin ana gövdesini değiştiren bir dinamik ileti eklemeye çalışıyorum. Varsayılan bir mesaj ayarlıyorum, ancak belirli bir gösterge ayarlandığında, farklı bir mesaj görüntülemek istiyorum. Mümkün mü?Bir ek açıklama mesajını çalışma zamanında değiştirebilir misiniz?

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

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

Ben en çok ilgilendiğim bir parça olduğunu - İşte

@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(); 
    } 
} 

açıklama kullandığı doğrulayıcı sınıfı var - İşte

benim ek açıklama var
+0

Bunu neden yapmaya çalışıyorsunuz? Neyi başarmaya çalıştığınızı anlamanıza yardımcı olur ... – DNA

+0

Farklı mesajlardan ayrı olarak, biriyle kolayca gerçekleştirilebilecek bir şey için iki ek açıklama oluşturmaktan kaçınmak istiyorum. Eşleşen alanları sağlamak ve eşleşmeyen alanları garanti etmek için kontrol etmek için bir ek açıklama arasındaki fark çok küçüktür. – coder

cevap

20

Bunu nasıl yapabiliyordum -

@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......... 
} 
+0

"İleti" ni yalnızca başlatma yönteminde özelleştirebilir veya isValid'de de aynısını yapabilir misiniz? –

İlgili konular