0

当我尝试在 grails 中保存域类时出现以下错误:

方法没有签名:java.lang.String.save() 适用于参数类型:() 值:[] 可能的解决方案:size()、size()、take(int)、wait()、any()、等待(长)。堆栈跟踪如下:

我有一个将 XML 字符串解析为域对象的服务。然后我尝试保存域并得到该错误。我已经调试并且知道所有数据都是有效的。这是我的代码:

   def newProfile="";

      newProfile = new LinkedinProfile(
        firstName               :   "${linkedinProfileFeed.'first-name'}",
        lastName                :   "${linkedinProfileFeed.'last-name'}",
        dobYear                 :   "${linkedinProfileFeed.'date-of-birth'.'year'}",
        dobMonth                :   "${linkedinProfileFeed.'date-of-birth'.'month'}",
        dobDay                  :   "${linkedinProfileFeed.'date-of-birth'.'day'}"  ,   
        imgUrl                  :   "${linkedinProfileFeed.'picture-url'}", 
        siteStandardAddress     :   "${linkedinProfileFeed.'site-standard-profile-request'}",           
        oAuthToken              :   accessTokenKey.toString(),
        secretKey               :   accessTokenSecret.toString()
       )
      .id="${linkedinProfileFeed.id}".toString()

      log.debug("${linkedinProfileFeed.id}".toString())
      log.debug("${linkedinProfileFeed.'first-name'}")
      log.debug("${linkedinProfileFeed.'last-name'}")
      log.debug("${linkedinProfileFeed.'date-of-birth'.'year'}")
      log.debug("${linkedinProfileFeed.'date-of-birth'.'month'}")
      log.debug("${linkedinProfileFeed.'date-of-birth'.'day'}")
      log.debug("${linkedinProfileFeed.'picture-url'}")
      log.debug("${linkedinProfileFeed.'site-standard-profile-request'}")
      log.debug(accessTokenKey.toString())
      log.debug(accessTokenSecret.toString())
      log.debug("end debug")





      newProfile.save();

另外,我不熟悉 grails 和 springsource,但在 .Net 中,我可以使用点运算符访问对象属性。例如,如果我有一个如上所述的对象,我可以输入 newProfile。并且可以访问所有属性。在 grails 中这不会发生。这是设计使然还是我的代码中有错误?

下面也是我的域类。

   class LinkedinProfile {
String firstName
String lastName
String dobYear
String dobMonth
String dobDay
String oAuthToken
String secretKey
String id
String imgUrl
String siteStandardAddress
Date dateCreated
Date lastUpdated
long version

static hasMany = [
    linkedinLocation        : LinkedinLocation,
    linkedinSkill           : LinkedinSkill
]

static mapping = {
    cache true
    id generator: 'assigned'

    columns {
        firstName           type:'text'
        lastName            type:'text'         
        oAuthToken          type:'text'
        secretKey           type:'text'         
        dobYear             type:'text'
        dobMonth            type:'text'
        dobDay              type:'text'
        imgUrl              type:'text'
        siteStandardAddress type:'text'
    }


}
static constraints = {
    firstName           (nullable:true)
    lastName            (nullable:true)     
    oAuthToken          (nullable:false)
    secretKey           (nullable:false)
    dobYear             (nullable:true)
    dobMonth            (nullable:true)
    dobDay              (nullable:true)     
    id                  (nullable:false)
    imgUrl              (nullable:true)
    siteStandardAddress (nullable:true)
}


def beforeInsert = {
//to do:  before insert, capture current email that is stored in the db
}

def afterInsert={
    //resave email
}

}

4

1 回答 1

2

该错误表明您正在调用save()字符串。如果我们进行调查,我们会发现您是。这是因为您正在分配

 newProfile = new LinkedinProfile().id="${linkedinProfileFeed.id}".toString()

所以 newProfile 实际上是 String linkedinProfileFeed.id,而不是人们想象的new LinkedinProfile()那样。

比较

groovy> def foo = new Post().id="1" 
groovy> foo.class 

Result: class java.lang.String

groovy> def foo = new Post(id: "1") 
groovy> foo.class 

Result: class test.Post

您可能希望将 放入id构造函数参数中。无论如何,您newProfile最终需要作为一个LinkedinProfile实例。然后你可以调用save()它。

也可以,您可以在 Groovy 中使用点运算符。

于 2012-09-22T17:16:44.847 回答