为什么 grails 第一次访问 hasMany 关系时会抛出空指针异常?

2024-04-05

我有一个奇怪的问题。
我有两个域类User and Post与字段:

class User {
  String name
  static hasMany = [posts: Post]
  static constraints = { }
}

and

class Post {
  String content
  long date = System.getTimeInMillis()
  static constraints = { }

  static belongsTo = [user: User]
  static mapping = {
    version: 'false'
  }
}

控制器代码是:

class UserController {
  def addUser = {
    def user
    if (User.count() == 0) {
      user = new User()
      user.name = "Manish Zedwal"
      user.save(flush: true)
    } else {
      user = User.get(1)
    }
    println "Posts count: " + user.posts.size()
    render "post count: " + user.posts.size()
 }
}

第一次访问url时http://localhost:8080/test/user/addUser,它会抛出空指针异常,但之后工作正常。
这是我遇到的例外

2011-08-04 15:41:25,847 [http-8080-1] ERROR errors.GrailsExceptionResolver  - Exception occurred when processing request: [GET] /test/user/addUser
Stacktrace follows:
java.lang.NullPointerException: Cannot invoke method size() on null object
        at test.UserController$_closure2.doCall(UserController.groovy:18)
        at test.UserController$_closure2.doCall(UserController.groovy)
        at java.lang.Thread.run(Thread.java:636)

第二次,它打印并渲染得像魅力一样精致

Posts count: 0

在用户域类中,因为hasMany关系为posts, posts是一个列表Post对象,那么在获取空列表的大小时不应该出现空指针异常,而应该为零。

任何帮助表示赞赏


当你映射这样的集合时,hasMany声明添加一个类型字段Set具有指定的名称(在本例中posts)到你的班级。但它不会初始化该集合,因此它最初为空。你打电话时addToPosts它检查它是否为 null,并在必要时创建一个新的空 Set,并将 Post 添加到集合中。但如果你不打电话addToPosts或者显式初始化该集合,它将为空。

当你加载一个User从数据库中,Hibernate 将填充所有字段,并且集合包含在其中。它创建一个新的 Set(一个修改感知的PersistentSet) 是空的,如果有实例则向其中添加实例。呼唤save()但不会从数据库重新加载实例,因此空集仍然为空。

为了让类在新类和持久类时都以相同的方式运行,您可以向类中添加一个字段,就像 Rob 在他的答案中所示,初始化为一个空集(Set posts = [])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 grails 第一次访问 hasMany 关系时会抛出空指针异常? 的相关文章

随机推荐