我有一个User
类,如下所示:
package com.grailsinaction
class User {
String userId
String password;
Date dateCreated
Profile profile
static hasMany = [posts : Post]
static constraints = {
userId(size:3..20, unique:true)
password(size:6..8, validator : { passwd,user ->
passwd!=user.userId
})
dateCreated()
profile(nullable:true)
}
static mapping = {
profile lazy:false
}
}
Post
这样的课程:
package com.grailsinaction
class Post {
String content
Date dateCreated;
static constraints = {
content(blank:false)
}
static belongsTo = [user:User]
}
我写了这样的集成测试:
//other code goes here
void testAccessingPost() {
def user = new User(userId:'anto',password:'adsds').save()
user.addToPosts(new Post(content:"First"))
def foundUser = User.get(user.id)
def postname = foundUser.posts.collect { it.content }
assertEquals(['First'], postname.sort())
}
我使用grails test-app -integration
运行,然后我收到如下错误:
Cannot invoke method addToPosts() on null object
java.lang.NullPointerException: Cannot invoke method addToPosts() on null object
at com.grailsinaction.PostIntegrationTests.testAccessingPost(PostIntegrationTests.groovy:23
我哪里出错?
答案 0 :(得分:1)
我的猜测是save()
方法返回null。试试这个:
def user = new User(userId:'anto',password:'adsds')
user.save() // Do you even need this?
user.addToPosts(new Post(content:"First"))
如果验证失败并且未保存实例,则save方法返回null,如果成功则保存实例本身。
因此,您可能应该查看验证中出现的问题...例如,您是否需要指定某些字段是可选的? (我不是Grails开发人员 - 只是想给你一些想法。)
答案 1 :(得分:1)
快速修复:您的密码必须介于6到8个字符之间(请查看您的约束字段)。
一个愚蠢的想法,充其量是为了拥有一个密码的最大大小(最终它们应该被散列并且与原始密码没有任何相似之处)。
另外,我可以建议Grails权威指南吗?