2016-06-06 2 views
0

나는 REST API를 제공하는 레거시 Scalatra 애플리케이션을 상속 받았다. 리턴 된 오브젝트가 다른 케이스 클래스에서 빌드되는 경우, 리턴 된 오브젝트의 직렬화는 완벽하게 작동합니다. 그러나 Java 또는 Scala 클래스에서 생성 된 객체를 반환하면 Scalatra에서 직렬화되지 않습니다. 나는 Object.toString()의 결과만을 얻을 것이다. 그렇다면 클래스가 아닌 클래스도 적절하게 직렬화해야합니까?Scalatra로 자바와 스칼라 객체의 직렬화

여기 내 수업

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

이며,이 내 서블릿입니다 :

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")) 
    } 
} 

답변

1

아닌 경우 클래스의 직렬화는 json4s에서 기본적으로 지원되지 않습니다. 수업에 CustomSerializer을 추가해야합니다.

또한 사용중인 jsonFormats에 해당 serializer를 추가해야합니다.

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

다음은 정규 클래스에서 serialize 된 json을 반환하는 작업 서블릿을 표시하도록 수정 된 json4s 설명서의 예제입니다.

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

}