2016-06-06 11 views
0

Ich arbeite an einer Java-Feder-MVC-Anwendung. Ich habe eine benutzerdefinierte Validierungsannotation für die Validierung einiger Zeichenfolgen (zum Beispiel) implementiert. Dies ist meine Anmerkung Körper:Java-Spring-Validierung - Feldtyp für benutzerdefinierte Validierung Annotation

@Documented 
@Constraint(validatedBy = PhoneValidator.class) 
@Target({ ElementType.METHOD, ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Phone { 

String message() default "{validation.phone}"; 

Class<?>[] groups() default {}; 

Class<? extends Payload>[] payload() default {}; 

} 

Und das ist meine PhoneValidator Klasse:

public class PhoneValidator implements ConstraintValidator<Phone, String> { 

    @Override 
    public void initialize(Phone a) { 

    } 

    @Override 
    public boolean isValid(String phone, ConstraintValidatorContext cvc) { 
     //my logic for validating the phone 

    } 

} 

Dies funktioniert und ich kann @Phone oben auf jedes Feld Modell setzen. Aber mein Problem ist Entwickler kann diese Anmerkung oben auf "irgendein" Modellfeld setzen und ich möchte nicht dieses irgendein! In der Tat, ich möchte Entwickler kann diese Anmerkung nur auf die String Felder setzen. Gibt es das überhaupt, um das zu tun?

Antwort

0

Momentan gibt es keinen Kompilierzeit-Prüfmechanismus für den Datentyp @Target. Aber wenn @Phone Annotation wurde auf einen anderen Datentyp als String platziert wird es eine Ausnahme während der Laufzeit (Mögliche ein ClassCastException), weil nach ConstraintValidator.isValid Methode erwartet streng ein String als Telefon.

@Override 
public boolean isValid(String phone, ConstraintValidatorContext cvc) { 
    //my logic for validating the phone 

} 
0

Ich habe mehrere benutzerdefinierte Validator Annotationen gemacht, hoffe, es kann Ihnen helfen.

@Documented 
    @Constraint(validatedBy = EnumStringValidator.class) 
    @Target({ElementType.METHOD, ElementType.FIELD}) 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface EnumString { 

     String message() default "{com.raycloud.supply.platform.validate.spec.EnumString.message}"; 

     Class<?>[] groups() default {}; 

     Class<? extends Payload>[] payload() default {}; 

     Class<? extends Enum> enumClass(); 
    } 



    public class EnumStringValidator implements ConstraintValidator<EnumString, CharSequence> { 

     private Class<? extends Enum> enumClass; 

     @Override 
     public void initialize(EnumString annotation) { 
      enumClass = annotation.enumClass(); 
     } 

     @Override 
     public boolean isValid(CharSequence field, ConstraintValidatorContext ctx) { 
      if (field == null) { 
       return true; 
      } 
      int len = field.length(); 

      if (len == 0) { 
       return false; 
      } 

      try { 
       Enum.valueOf(enumClass, field.toString()); 
      } catch (RuntimeException re) { 
       return false; 
      } 

      return true; 
     } 

------------------------- 

@Documented 
@Constraint(validatedBy = { 
     TrimmedValidatorForCharSequence.class, 
     TrimmedValidatorForIterable.class}) 
@Target({ElementType.METHOD, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Trimmed { 

    String message() default "{com.raycloud.supply.platform.validate.spec.Trimmed.message}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

} 

public class TrimmedValidatorForCharSequence implements ConstraintValidator<Trimmed, CharSequence> { 

    @Override 
    public void initialize(Trimmed annotation) { 
    } 

    @Override 
    public boolean isValid(CharSequence field, ConstraintValidatorContext ctx) { 
     if (field == null) { 
      return true; 
     } 
     int len = field.length(); 

     if (len == 0) { 
      return false; 
     } 

     if (Util.isWhiteSpace(field.charAt(0)) || Util.isWhiteSpace(field.charAt(len - 1))) { 
      return false; 
     } 

     return true; 
    } 

public class EnumStringValidator implements ConstraintValidator<EnumString, CharSequence> { 

    private Class<? extends Enum> enumClass; 

    @Override 
    public void initialize(EnumString annotation) { 
     enumClass = annotation.enumClass(); 
    } 

    @Override 
    public boolean isValid(CharSequence field, ConstraintValidatorContext ctx) { 
     if (field == null) { 
      return true; 
     } 
     int len = field.length(); 

     if (len == 0) { 
      return false; 
     } 

     try { 
      Enum.valueOf(enumClass, field.toString()); 
     } catch (RuntimeException re) { 
      return false; 
     } 

     return true; 
    } 


------------------------- 

@Target({TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = MethodVerifyValidator.class) 
@Documented 
public @interface MethodVerify { 

    /** 
    * validator class 
    */ 
    Class<?> verifyClass(); 

    /** 
    * validator method name 
    */ 
    String methodName() default "verify"; 

    /** 
    * method parameter types 
    */ 
    Class[] parameterTypes() default {}; 

    String message() default "{com.raycloud.amazon.validate.MethodVerify.message}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    @Target({TYPE, ANNOTATION_TYPE}) 
    @Retention(RUNTIME) 
    @Documented 
    @interface methods { 
     MethodVerify[] value(); 
    } 

} 

public class MethodVerifyValidator 
     implements ConstraintValidator<MethodVerify, Object> { 

    private Method method; 

    @Override 
    public void initialize(final MethodVerify annotation) { 
     String name = annotation.methodName(); 
     Class[] types = annotation.parameterTypes(); 

     method = Util.findMethod(annotation.verifyClass(), name, types); 
     if (method == null) { 
      throw new IllegalStateException("none method found!"); 
     } 

     Util.makeAccessible(method); 
    } 

    @Override 
    public boolean isValid(final Object value, final ConstraintValidatorContext ctx) { 
     //if(value == null)//value != null 
     try { 
      method.invoke(value); 
     } catch (Exception re) { 
      return false; 
     } 

     return true; 
    } 

} 
Verwandte Themen