首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法保存域类实例;获取类型不匹配错误

无法保存域类实例;获取类型不匹配错误
EN

Stack Overflow用户
提问于 2012-02-03 12:53:34
回答 1查看 1.9K关注 0票数 0

我有如下的域类:

代码语言:javascript
运行
复制
package mnm.schedule 

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

User.groovy

代码语言:javascript
运行
复制
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       
} 

我有一个视图文件,其中包含以下代码片段:

代码语言:javascript
运行
复制
<g:each in="${ans}">
                <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" value="${ans}" checked="false" /></li>
</g:each>

变量ans是数组列表,它有用户对象。我使用g:checkBox,以便最终用户可以“检查”所需的用户name.When用户提交此表单,我在我的控制器中执行此操作:

代码语言:javascript
运行
复制
def users = params.checkedUsers 
users.each { index -> 
    new Project(name:"testing",users:index).save() 

    }   

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

但这会抛出如下错误:

代码语言:javascript
运行
复制
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

怎么回事?我哪里做错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-03 15:13:06

对我来说,有几件事似乎有点奇怪(但也许我没有完全理解您想要实现的目标)。

查看:

代码语言:javascript
运行
复制
<g:each in="${ans}">
    <li>${it.username.toUpperCase()}<g:checkBox name="checkedUsers" 
       value="${it.id}" checked="false" /></li>
</g:each>

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

在控制器中,传递的参数是字符串类型,这就是为什么会出现类型不匹配的原因。有几种方法可以做到这一点,一种解决方案如下:

控制器:

代码语言:javascript
运行
复制
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()
}

我相信您可以进一步简化这一过程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9123848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档