2015-02-20 26 views
5

Używam Play! Scala 2.2 i mam problem renderować class w Json:Play Scala: pisarz json dla klas zagnieżdżonych

Mam dwie klasy z jednym zależnie od siebie, jak następuje:

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]) 

i ich ukrytych scenariusz:

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

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

Pisarze pracują dobrze, wykonując następujące czynności:

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

tj. Jeśli Artist ma pustylist of tracks. Ale jeśli chcę to zrobić:

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

Dostaję execution exception: [NullPointerException: null]

Czy możesz wyjaśnić mi, co robię źle? Thanks;)

Odpowiedz

4

Problem polega na zamówieniu inicjującym. Json.writes[Artist] wymaga domyślnego Writes[Track] w celu wygenerowania. Kompilator jest w stanie odnaleźć ukrytą Writes[Track], bo jesteś deklarowania go w tym samym obiekcie, jednaktrackWrites jest inicjowany poartistWrites, co oznacza, że ​​gdy Json.writes[Artist] nazywa, trackWrites jest null. Nie przeszkadza to jednak w tworzeniu artistWrites, więc pozostaje niezauważone, dopóki nie zostanie faktycznie użyte.

Można to naprawić, po prostu przełączając kolejność inicjowania, tak aby trackWrites był pierwszy.

+0

Nie wiedziałem o tym! Dzięki;) – Simon

+0

Łatwo wpaść w tę pułapkę, ponieważ kompilator nie wysyła żadnych ostrzeżeń na ten temat. Prawdopodobnie 99% NPE, które dostaję w Scali, pojawia się od problemów z kolejnością inicjalizacji. –

Powiązane problemy