Grails Domain Classes遇到问题。我重写构造函数以从net.sf.json.JSONObject构建域类对象。当我通过控制器对对象进行实例化时,这很好用。然后我尝试通过测试用例实例化它,并得到一个例外:
没有方法签名:profileplugin.Contact.addToEmails()适用于参数类型:(java.lang.String)值:[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:["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); };
};
}
答案 0 :(得分:2)
您是否为域类定义了模拟对象? see
答案 1 :(得分:2)
检查您的源代码,,
结尾处不应该有websites: String,
我很惊讶它编译了。
为String类放置hasMany关系有nosense(除非你想在其上进行数据库事务,否则最好为电话,传真,电子邮件和网站创建域类)。你应该这样改写:
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...
感谢ben