【问题标题】:add domain object to gorm relationship gets null pointer exception将域对象添加到 gorm 关系获取空指针异常
【发布时间】:2013-10-29 15:47:33
【问题描述】:

这是我的域类定义:

class Profile {
           PhotoAlbum photoAlbum

           static constraints = {
               photoAlbum(nullable:true)
           }
}

class PhotoAlbum {

        static hasMany = [photos:Photo]
        static belongsTo = [profile:Profile]

}

class Photo {
       static belongsTo = PhotoAlbum
}

在控制器中,我将拥有一个实例化的配置文件域。该域以空 photoAlbum 开始。如果我想添加第一张照片,我会在 photoAlbum 上得到一个空指针异常:

Photo photo = new Photo()

profile.photoAlbum.addToPhotos(photo)

有什么方法可以避免空指针异常:

Photo photo = new Photo()

if (!profile.photoAlbum) { profile.photoAlbum = new PhotoAlbum) }

profile.photoAlbum.addToPhotos(photo)

我原以为如果 photoAlbum 为空,当我尝试向其添加第一个照片对象时,grails 只会创建一个新对象。虽然上面的 3 行代码可以工作,但我想知道是否有更好的方法可以在 2 行代码中完成同样的事情。

【问题讨论】:

  • 你正在做它可以做到的,恕我直言。任何以 null 开头的不是托管集合 (hasMany) 的属性都将为 null,直到您将其设为非 null。 Grails/Groovy 不能仅仅因为你的代码试图在一个空对象上设置一个属性,你就打算让它为你实例化它。

标签: grails grails-orm


【解决方案1】:

您可以覆盖ProfilePhotoAlbum 的getter 以按需创建相册:

class Profile {
    ...
    PhotoAlbum getPhotoAlbum() {
        if (photoAlbum == null) {
            photoAlbum = new PhotoAlbum()
        }
        photoAlbum
    }
}

然后当你调用profile.photoAlbum 时,它会按照你的预期自动创建。但是,每当调用 getter 时,这将创建空专辑,这可能不是您想要的。我会让它更明确,像这样:

class Profile {
    ...
    PhotoAlbum createOrGetPhotoAlbum() {
        if (photoAlbum == null) {
            photoAlbum = new PhotoAlbum()
        }
        photoAlbum
    }
}

然后这样称呼它:profile.createOrGetPhotoAlbum().addToPhotos(photo)

【讨论】:

  • 是的,我确实喜欢这个选项。干净整洁。
  • 直到您需要查找具有 null PhotoAlbum 的个人资料,这可能是个问题,因为它总是返回非空。
  • 第二种选择使创建明确并避免了该问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多