2012-01-13 96 views
3

Grails域類遇到問題。我重寫構造函數從net.sf.json.JSONObject構建域類對象。當我通過控制器檢測對象時,這工作正常。然後我嘗試通過一個測試用例來實例化它,並且得到一個異常:Grails addTo *未創建

沒有簽名的方法:profileplugin.Contact.addToEmails()適用於參數類型:(java.lang.String)values:[something @ something.com]

我還應該指出,這似乎適用於某些類,但不適用於其他類。非常令人沮喪 - 我是新來的Grails,所以如果任何人都能指出我正確的方向,我會非常感激。

這是我的域類代碼。

package profileplugin 

import net.sf.json.JSONObject 

class Contact 
{ 
    static hasMany = 
    [ 
     phones: String, 
     faxes: String, 
     emails: String, 
     websites: String, 
    ]; 

    Contact() {}; // standard constructor must be specified, or grails dies 
    Contact(JSONObject source) 
    { 
     source.get('emails').each()   { this.addToEmails(it); }; 
     source.get('websites').each()  { this.addToWebsites(it); }; 
     source.get('phones').each()   { this.addToPhones(it); }; 
     source.get('faxes').each()   { this.addToFaxes(it); }; 
    }; 

} 

而且這裏有一個例子源JSON字符串...

[ 
    addresses:[], 
    phones:["(555) 555-7011"], 
    faxes:[], 
    emails:["[email protected]"], 
    websites:["http://www.google.com"] 
] 

最後,這裏是工作的代碼的版本(以下獲得反饋後):

class Contact 
{ 
    def phones = []; 
    def faxes = []; 
    def emails = []; 
    def websites = []; 

    Contact() {}; // standard constructor must be specified, or grails dies 
    Contact(JSONObject source) 
    { 
     print source; 

     source.get('phones').each()   { this.phones.add(it); }; 
     source.get('emails').each()   { this.emails.add(it); }; 
     source.get('websites').each()  { this.websites.add(it); }; 
     source.get('faxes').each()   { this.faxes.add(it); }; 
    }; 

} 
+0

你能壓縮的樣本項目,所以我們可以看看? – Mengu 2012-01-13 01:35:44

回答

2

檢查你的源代碼,你不應該有一個,websites: String,的末尾我很驚訝它編譯。

有沒有理由把一個String類有很多關係(除非你想對它做數據庫事務,那麼最好是爲電話,傳真,電子郵件和網站創建域類)。你應該重寫這個方法:

package profileplugin 

import net.sf.json.JSONObject 

class Contact 
{ 

    String[] phones=new String[] 
    String[] faxes=new String[] 
    String[] emails=new String[] 
    String[] websites=new String[] 

    ... 

} 

,然後使用:

this.emails.add(it) 

而且,可能更重要的是,你不應該將域名添加類中的業務邏輯,它應該是你的控制器內,服務或在某些外部類別(在src目錄下)。

編輯: 其實並不正確編譯,正確的語法是:

def emails = [] 
etc... 

得益於奔

+0

在java和groovy中,地圖,數組或列表定義中的尾隨逗號都很好 – 2012-01-13 13:07:08

+0

很有意思,謝謝! – fixitagain 2012-01-13 13:13:25

+1

「你*不應該*在你的域類中添加業務邏輯」 - IMNSHO這是錯誤的部分。當然,Hibertate會干擾setter中的邏輯,但業務邏輯是域類的定義。 – 2012-01-13 15:26:46