无法保存域类实例;得到类型不匹配错误

时间:2012-02-03 04:53:34

标签: grails groovy

我有域类:

package mnm.schedule 

class Project { 
        static hasMany = [ tasks : Tasks , users : User ] 
        String name 
        static constraints = { 
                name(nullable:false) 
                tasks(nullable:true) 
        } 
}

User.groovy

package mnm.schedule 
import org.example.*; 
class User extends SecUser { 
        //relationships. . . . 
        static belongsTo = [ company : Company, role : Role, resource : Resource] 
        static hasMany = [ holidays : Holiday, tasks : Tasks, pt:String ] 
        Profile profile 
        Project project 
        String username 
        String password 
        boolean enabled 
        List pt 
        boolean ptTaken       
} 

我有一个视图文件,里面有我的代码片段:

<g:each in="${ans}">
                <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" value="${ans}" checked="false" /></li>
</g:each>

变量ans是arraylist,具有用户对象。我使用g:checkBox,以便最终用户可以“检查”所需的用户名。当用户提交此表单时,我在我的控制器中执行此操作:

def users = params.checkedUsers 
users.each { index -> 
    new Project(name:"testing",users:index).save() 

    }   

我的想法是我需要将选择用户(通过复选框)添加到项目中。

但是这会将错误抛出:

2012-02-03 10:13:08,173 ["http-bio-8080"-exec-4] ERROR errors.GrailsExceptionResolver  - TypeMismatchException occurred when processing request: [POST] /scheduleNew/project/project - parameters: 
_checkedUsers: 
_checkedUsers: 
Add: Add 
checkedUsers: anto2 
Provided id of the wrong type for class mnm.schedule.User. Expected: class java.lang.Long, got class java.lang.String. Stacktrace follows: 
Message: Provided id of the wrong type for class mnm.schedule.User. Expected: class java.lang.Long, got class java.lang.String

怎么回事?哪里出错了?

1 个答案:

答案 0 :(得分:1)

对我来说似乎有点奇怪(但也许我并不完全理解你想要实现的目标)。

查看:

<g:each in="${ans}">
    <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" 
       value="${it.id}" checked="false" /></li>
</g:each>

我会传递id而不是整个列表(你有值=“$ {ans})

在控制器中,传递的参数是String类型,这就是你得到类型不匹配的原因。有几种方法可以做到这一点,下面有一个解决方案:

控制器:

def actionCalled = {
   def project = new Project(name:"testing")       
   def users = params.checkedUsers
   users.each { index -> 
      def user = User.findById(index.toLong())
      project.addToUsers(user)
   }   
   project.save()
}

我相信你可以进一步简化这一点。