Grails addTo * не создается - PullRequest
       2

Grails addTo * не создается

3 голосов
/ 13 января 2012

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

Нет сигнатуры метода: 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:["someone@something.com"], 
    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);    };
    };

}

Ответы [ 2 ]

2 голосов
/ 13 января 2012

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

Нет смысла ставить отношения 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).

РЕДАКТИРОВАТЬ: на самом деле он не компилируется должным образом, правильный синтаксис:

def emails = []
etc...

спасибо Бен

2 голосов
/ 13 января 2012

Вы определили фиктивный объект для класса домена? см

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...