2012-01-13 3 views
3

Проблемы с классами классов Grails. Я переопределяю конструктор для создания объекта класса домена из файла net.sf.json.JSONObject. Это прекрасно работает, когда я навязываю объект через контроллер. Затем я попытался создать экземпляр его с помощью тестового примера и получил исключение:Grails addTo * не создается

Нет подписи метода: profileplugin.Contact.addToEmails() применим для типов аргументов: (java.lang.String) значения: [что-то @ 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

ответ

2

Проверьте исходный код, вы не должны иметь , в конце своего websites: String,. Я удивлен, что он скомпилировался.

Существует noosense для размещения отношений hasMany для класса 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).

EDIT: на самом деле он не компилируется правильно, правильный синтаксис:

def emails = [] 
etc... 

благодаря бен

+0

В java и groovy, запятые запятые на карте, определения массива или списка являются точными –

+0

Полезно знать, спасибо! – fixitagain

+1

«вы * НЕ ДОЛЖНЫ * добавить бизнес-логику внутри своего класса домена» - IMNSHO - это ложная часть. Конечно, Hibertate вмешивается в логику в сеттерах, но бизнес-логика - это * THE * определение классов домена. –

Смежные вопросы