2011-12-06 5 views
7

303 Özel kısıt Bu kısıtlamanın model kodunda. Ayrıca bu geçersiz kılınmış mı yoksa yalnızca geçersiz kılınmış ek açıklama için iki kez mi onaylanacak? EğerJSR i bazı geçersiz kılmak için bir yol yoktur alanlar (bu durumda String) üzerinde (3 ila 240 karakter uzunluğunda olduğu gibi boş değil alfanümerik dize) Standart kısıtlamaları ayarlamak koymak istiyoruz ve bilmek istiyorum geçersiz kılma

Tamam cevaplar için

bu

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

sayesinde gibi bir şey olmalı, kendim cevap. wich iç içe açıklama parametresini

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

cevap

5

Güzel bir soru yeniden atamak için yardımcı olur @OverridesParameter yoktur. JSR 303 Bean Validation specification, bölüm 3.5'teki doğrulama yordamını açıklar. çalıştıracaktır, erişilebilir tüm alanlar için

  • : Belirli bir grup doğrulamak için için

    bir verilen fasulye örneğinde uygulanan doğrulama rutin özel bir sırada aşağıdaki kısıtlama doğrulamaları yürütmek için beklenen verilen doğrulama kısıtlama zaten belirli bir seyir yolu bu doğrulama işlemi sırasında işleme olmadığı sürece hedeflenen grubuna uygun (üst sınıfı ifade olanlar da dahil olmak üzere) alanı seviyesi doğrulamaları önceki bir parçası olarak (Bölüm 3.5.1 bakınız) grup maçı.

...

nesne doğrulama rutin gibi tarif edilmektedir. Her kısıtlama bildirimi için:

  • kısıtlama beyanı için uygun ConstraintValidator (bakınız Madde 3.5.3) kullanmak için belirler. isValid gerçek dönerse isValid Bean Doğrulama sağlayıcı olarak doldurulur yanlış dönerse
  • uygun verilere (kısıt doğrulama uygulamasından) isValid işlemini yürütmek, sonraki kısıtlama devam
  • (bakın Bölüm 2.4) Kısım 2.4'de tanımlanan kurallara göre ConstraintViolation nesnesini (nesneleri) ve bu nesneleri kısıtlama ihlali listesine ekler. Senin durumunda

, hedeflenen grup Default basit String alanın doğrulama başa. Belgelere göre belirli bir sırayla ayrı ayrı onaylanacak/işlenecek iki doğrulama sınırlama (@AlphanumericString ve @Size) var.

Yani soruyu cevaplamak için. Hayır, Additionaly @Size kullandığınızda @AlphanumericString uygulanan hiçbir geçersiz kılma olacaktır.Ne yapmaya teşebbüs ne düşündüğünü elde edebilmek için, size overridde böyle beste açıklamalarından yapılan niteliklerini bir kısıt kompozisyon yaratabilir:

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

ve bu gibi kullanabilirsiniz:

@AlphanumericString(min = 100, max = 150) 
+0

Teşekkürler, bu yöntemin kullanılmaya çalışılacağını düşündüğünüzde, onaylama sürecini hızlandırmanın bir yolunu önerebilir misiniz, uygulama başına sadece bir kez geçerlilik fabrikası oluşturmaktan başka bir şey değil, doğrulamayı gruplara bölmek ve daha hızlı işlem süreleri için daha hızlı sipariş vermek için mi? – Pilgrim