Json Grails addTo*未被创建
Grails域类有问题。我正在重写构造函数以从net.sf.json.JSONObject构建域类对象。当我通过一个控制器使一个对象疯狂时,这可以很好地工作。然后我尝试通过一个测试用例对其进行实例化,并得到一个异常: 没有方法的签名:profileplugin.Contact.addToEmails()适用于参数类型:(java.lang.String)值:[something@something.com] 我还应该指出,这似乎适用于某些类,但不适用于其他类。非常令人沮丧——我是Grails新手,所以如果有人能给我指出正确的方向,我将非常感激 这是我的域类代码Json Grails addTo*未被创建,json,grails,groovy,Json,Grails,Groovy,Grails域类有问题。我正在重写构造函数以从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"]
]
最后,这里是有效的代码版本(在获得以下反馈后):
您是否为域类定义了模拟对象 检查您的源代码,您不应该在
网站: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...
感谢ben您能否压缩一个示例项目,让我们看一看?在java和groovy中,映射、数组或列表定义中的尾随逗号都很好“您不应该在域类中添加业务逻辑”-IMNSHO这是错误的部分。当然,Hibertate会干扰setter中的逻辑,但是业务逻辑是域类的定义。您好,感谢您的响应,但是您的示例代码没有编译。语法似乎不正确。通过指定数组大小(def phones=new String[100]),我得到了一个稍微不同的错误。但同样的问题是:没有方法[Ljava.lang.String;.add()的签名适用于参数类型:(java.lang.String)好的,我已经让它工作了,部分是基于您的建议。使用工作代码更新帖子。
def emails = []
etc...