Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Grails addTo*未被创建_Json_Grails_Groovy - Fatal编程技术网

Json Grails addTo*未被创建

Json Grails addTo*未被创建,json,grails,groovy,Json,Grails,Groovy,Grails域类有问题。我正在重写构造函数以从net.sf.json.JSONObject构建域类对象。当我通过一个控制器使一个对象疯狂时,这可以很好地工作。然后我尝试通过一个测试用例对其进行实例化,并得到一个异常: 没有方法的签名:profileplugin.Contact.addToEmails()适用于参数类型:(java.lang.String)值:[something@something.com] 我还应该指出,这似乎适用于某些类,但不适用于其他类。非常令人沮丧——我是Grails新手

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...