2017-03-20 43 views
0

我有4個字段需要價格(BigDecimal),但只有其中一個應包含價格。如果price2包含255.95,並且有人想要在price1中輸入價格那麼這應該被拒絕,並顯示一條消息,說明您必須清除另一個(本例中爲price2) 我試圖在域中執行此操作,但它沒有爲我工作。Grails驗證不可變字段

一個例子:

class Author { 
    def String name 
    def String email 
    def BigDecimal price1 
    def BigDecimal price2 
    def BigDecimal price3 
// static hasMany = [books: Book] 

    static constraints = { 
     name nullable:true 
     email nullable:true 
     price1(nullable:true, 
      validator: { val, obj -> 
       (obj.price2==null) and (obj.price3 == null) }) 
     price2(nullable:true, 
      validator: { val, obj -> 
       (obj.price1==null) and (obj.price3 == null) }) 
     price3(nullable:true, 
      validator: { val, obj -> 
       (obj.price1==null) and (obj.price2 == null) }) 
    } 
    static mapping = { 
     name column: "AuthorName", sqltype:"char", length:25 
    } 
    String toString() { 
     return name 
    } 
    def beforeValidate() { 
    } 
} 

我得到這個錯誤:

groovy.lang.MissingMethodException: No signature of method: masterdetail.Author.and() is applicable for argument types: (java.lang.Boolean) values: [true] 
Possible solutions: any(), any(groovy.lang.Closure), find(), find(groovy.lang.Closure), find(java.lang.String), find(masterdetail.Author) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58) 
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:81) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166) 
    at masterdetail.Author$__clinit__closure1$_closure3.doCall(Author.groovy:16) 

那麼,怎麼辦呢?

+2

布爾條件以'&&'結尾。 – doelleri

+0

當然,我通常使用DELPHI進行編程,所以有時候我不認識到我的明顯錯誤。謝謝! – larand

+0

我編輯了這個例子來顯示工作版本,以防某人感興趣。 – larand

回答

0

最後,我解決了一些幫助來自doelleri的問題。 我編輯了問題,以便它包含最終解決方案。