2015-02-20 15 views
5

Tôi đang sử dụng Play! Scala 2.2 và tôi có một vấn đề để biểu hiện một class trong Json:Chơi Scala: json writer cho các lớp lồng nhau

Tôi có hai lớp với một phụ thuộc vào người kia, như sau:

case class Artist(id: String, cover: String, website: List[String], link: String, Tracks: List[Track] = List()) 

case class Track(stream_url: String, title: String, artwork_url: Option[String]) 

Và nhà văn tiềm ẩn của họ:

implicit val artistWrites: Writes[Artist] = Json.writes[Artist] 

implicit val trackWrites: Writes[Track] = Json.writes[Track] 

Các tác giả hoạt động tốt như sau:

println(Json.toJson(Track("aaa", "aaa", Some("aaa")))) 
println(Json.toJson(Artist("aaa", "aaa", List("aaa"), "aaa", List()))) 

có nghĩa là Artist có một số trốnglist of tracks. Nhưng nếu tôi muốn làm điều này:

println(Json.toJson(Artist("aaa", "aaa", List("aaa"), "aaa", List(SoundCloudTrack("ljkjk", "ljklkj", Some("lkjljk")))))) 

tôi nhận được một execution exception: [NullPointerException: null]

bạn có thể vui lòng giải thích cho tôi những gì tôi đang làm sai? Cảm ơn;)

Trả lời

4

Sự cố là thứ tự khởi tạo. Json.writes[Artist] yêu cầu ẩn Writes[Track] để tự tạo. Trình biên dịch có thể tìm thấy những tiềm ẩn Writes[Track], bởi vì bạn đang khai báo nó trong cùng một đối tượng, tuy nhiên trackWrites được khởi sauartistWrites, có nghĩa là khi Json.writes[Artist] được gọi, trackWritesnull. Điều này không làm gián đoạn việc tạo ra artistWrites, tuy nhiên, do đó, nó không được chú ý cho đến khi nó thực sự được sử dụng.

Bạn có thể sửa lỗi này bằng cách đơn giản chuyển đổi thứ tự khởi tạo để trackWrites là thứ nhất.

+0

Tôi không biết điều này! Cảm ơn;) – Simon

+0

Thật dễ dàng để rơi vào cái bẫy này bởi vì trình biên dịch không phát ra bất kỳ cảnh báo nào về điều này. Có lẽ 99% số NPE mà tôi nhận được trong Scala xảy ra từ các vấn đề về thứ tự khởi tạo. –

Các vấn đề liên quan