2013-10-29 62 views
0

這裏是我的領域類的定義:添加域對象格姆關係得到空指針異常

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。如果我想補充的第一張照片,我會在畫冊一個空指針異常:

Photo photo = new Photo() 

profile.photoAlbum.addToPhotos(photo) 

什麼grailsy方式做到這一點,避免空指針異常:

Photo photo = new Photo() 

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

profile.photoAlbum.addToPhotos(photo) 

我會認爲如果photoAlbum爲null,當我嘗試將第一個照片對象添加到它時,grails會創建一個新的。雖然上面的3行代碼工作,但我想知道是否有更好的方法來完成2行代碼中的同一件事。

+1

你正在做的以及是可以做到的,恕我直言。任何不是託管集合(hasMany)的開始爲null的屬性都將爲空,直到您使其不爲空。 Grails/Groovy不能假定僅僅因爲你的代碼試圖在一個空對象上設置一個屬性,你打算讓它爲你實例化它。 – Gregg

回答

0

可以覆蓋PhotoAlbum的吸氣劑Profile按需創建相冊:

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)

+0

是的,我的確喜歡這個選項。很好,很乾淨。 – spock99

+0

在您需要查找具有空PhotoAlbum的配置文件之前,這可能是個問題,因爲它總是返回非空值。 – Gregg

+0

第二種選擇使得創建顯式並避免了這個問題。 – ataylor