2016-06-06 20 views
0

Ich habe eine ältere Scalatra-Anwendung geerbt, die eine REST-API anbietet. Die Serialisierung des zurückgegebenen Objekts funktioniert einwandfrei, wenn das zurückgegebene Objekt eine Fallklasse ist, die auf anderen Fallklassen erstellt wurde. Wenn Sie jedoch ein Objekt zurückgeben, das aus einer Java- oder Scala-Klasse erstellt wurde, wird es von Scalatra nicht serialisiert. Ich werde nur das Ergebnis von Object.toString() erhalten. Also, was muss ich tun, um auch nicht-Fall-Klassen richtig zu serialisieren?Serialisierung von Java- und Scala-Objekten mit Scalatra

Hier ist meine Klasse

class Snafu(sna: String, foo: String) { 
} 

und das ist mein Servlet:

class HealthServlet(implicit inj: Injector) 
extends ScalatraServlet with SLF4JLogging 
with JacksonJsonSupport 
with Injectable with InternalViaLocalhostOnlySupport { 
protected implicit val jsonFormats: Formats = DefaultFormats 

val healthStateCheck = inject[HealthStateCheck] 

    before("/") { 
    } 

    get("/") { 
    Ok(new Snafu("4", "2")) 
    } 
} 

Antwort

1

Nicht Fall Klasse Serialisierung ist nicht standardmäßig in json4s unterstützt. Sie müssen eine CustomSerializer für Ihre Klassen hinzufügen.

class IntervalSerializer extends CustomSerializer[Interval](format => (
    { 
    // Deserialize 
    case JObject(JField("start", JInt(s)) :: JField("end", JInt(e)) :: Nil) => 
     new Interval(s.longValue, e.longValue) 
    }, 
    { 
    // Serialize 
    case x: Interval => 
     JObject(JField("start", JInt(BigInt(x.startTime))) :: 
     JField("end", JInt(BigInt(x.endTime))) :: Nil) 
    } 
)) 

Sie müssen diese Serializer auch zu den verwendeten jsonFormats hinzufügen.

protected implicit lazy val jsonFormats: Formats = DefaultFormats + FieldSerializer[Interval]() 

Hier ist das Beispiel aus der Dokumentation json4s modifiziert, um eine Arbeits Servlet zeigen serialisierten json von einer regulären Klasse zurück.

import org.json4s._ 
import org.json4s.JsonAST.{JInt, JField, JObject} 
import org.scalatra.json.JacksonJsonSupport 

class Interval(start: Long, end: Long) { 
    val startTime = start 
    val endTime = end 
} 

class IntervalSerializer extends CustomSerializer[Interval](format => (
    { 
    // Deserialize 
    case JObject(JField("start", JInt(s)) :: JField("end", JInt(e)) :: Nil) => 
     new Interval(s.longValue, e.longValue) 
    }, 
    { 
    // Serialize 
    case x: Interval => 
     JObject(JField("start", JInt(BigInt(x.startTime))) :: 
     JField("end", JInt(BigInt(x.endTime))) :: Nil) 
    } 
)) 

class IntervalServlet extends ScalatraServlet with ScalateSupport with JacksonJsonSupport { 

    get("/intervalsample") { 
    contentType = "application/json" 

    val interval = new Interval(1, 2) 

    Extraction.decompose(interval) 
    } 

    protected implicit lazy val jsonFormats: Formats = DefaultFormats + FieldSerializer[Interval]() 

}