我有域类:
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
怎么回事?哪里出错了?
答案 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()
}
我相信你可以进一步简化这一点。