2013-04-24 23 views
5

Ben grants 2.2.1 kullanıyorum ve iç içe bir komut yapısını doğrulamaya çalışıyorum. İşte benim komut nesnelerin basitleştirilmiş bir versiyonudur: grails iç içe yerleştirilmiş komut nesnesini doğrulamıyor

@Validateable 
class SurveyCommand { 

    SectionCommand useful 
    SectionCommand recommend 

    SurveyCommand() { 
     useful = new SectionCommand(
       question: 'Did you find this useful?', 
       isRequired: true) 
     recommend = new SectionCommand(
       question: 'Would you recommend to someone else?', 
       isRequired: false) 
    } 
} 

@Validateable 
class SectionCommand { 
    String question 
    String answer 
    boolean isRequired 

    static constraints = { 
     answer(validator: answerNotBlank, nullable: true) 
    } 

    static answerNotBlank = { String val, SectionCommand obj -> 
     if(obj.isRequired) { 
      return val != null && !val.isEmpty() 
     } 
    } 
} 

ben hep true bölüm değerler ve SectionCommand (answerNotBlank) benim özel doğrulayıcı asla denir olursa olsun döner SurveyCommand bir örneğini doğrulamaya çalışır

. Mezar belgelerinden, this kind of nested structure is supported ( deepValidate varsayılan değeri true) gibi görünüyor. Ancak, belki bu kural sadece Komut nesneleri değil, alan adı nesneleri için de geçerlidir. Yoksa burada bir şey mi özledim? Eğer o zaman Config.groovy yılında command nesneleri kayıt etmelidir mockForConstraintsTest() kullanılarak validation unit den testleri sınıyor yerine çünkü içinde @Validateable kullanıyorsanız

cevap

4

sadece ana komut nesnesi

@Validateable 
class SurveyCommand { 

    SectionCommand useful 
    SectionCommand recommend 

    static subValidator = {val, obj -> 
     return val.validate() ?: 'not.valid' 
    } 

    static constraints = { 
     useful(validator: subValidator) 
     recommend(validator: subValidator) 
    } 

    SurveyCommand() { 
     useful = new SectionCommand(
      question: 'Did you find this useful?', 
      isRequired: true) 
     recommend = new SectionCommand(
      question: 'Would you recommend to someone else?', 
      isRequired: false) 
    } 
} 
+0

nice! harika çalışıyor, ancak her alt özellik için bir kısıtlama açıkça tanımlamak yerine daha fazla KURU bir yol var mı? –

2

için özel bir doğrulayıcı ekleyebilirsiniz mevcut Grails Bug. Detaylar için bu SO question/answers'a bakın.

Sen Grails 2.3 için Config.groovy

grails.validateable.classes = 
      [yourpackage.SurveyCommand, yourpackage.SectionCommand] 
+0

* bir * @ Validatable' komut sınıfının '.validate()' yöntemini sınamadan önce basitçe 'mockCommandObject' yöntemini çağırmak için (2.2.1'de) iyi çalışıyor. 'mockCommandObject SurveyCommand' –

+0

Kabul ediyor. Bu daha önce bahsettiğim SO soru/cevap benim yaklaşımım oldu. 'mockCommandObject' çalışır ancak 'mockForConstraintsTest' başarısız olur. – dmahapatro

+0

ah, anladım, açıkladığın için teşekkürler. Açıkçası yeterince yakın okumadım. –

5

olarak aşağıda validateable sınıf, kayıt ve sonra ben Cascade Validation Plugin güzel bu sorunu çözer olduğunu tespit ettik. Tam olarak beklediğiniz şeyi yapan çağlayan adı verilen yeni bir doğrulayıcı türü tanımlar. Yüklendikten sonra örneğiniz şöyle olur:

class SurveyCommand { 
    ... 

    static constraints = { 
     useful(cascade: true) 
     recommend(cascade: true) 
    } 
}