2016-05-02 8 views
1

Wir verwenden Scalatra 2.4 mit JacksonJsonSupport 3.3 und haben Probleme bei der Serialisierung von Java8 LocalDateTime. Es ist fehlgeschlagen mit "Kein Konstruktor für den Typ LocalDateTime, JObject (List())"Wie benutze ich Scalatra mit Java8 LocalDateTime

Ich habe eine Reihe von Suchanfragen versucht, um eine Auflösung zu finden; mit vielen Verweisen auf den JSR-310 ObjectMapper. Ich habe jedoch keine Möglichkeit gefunden, diesen Mapper mit Scalatra zu verwenden.

Könnte jemand einen Hinweis geben, wie Java8-Datetime-Formate mit Scalatras Json-Unterstützung serialisiert werden?

Danke.

Hier ist, was ich hoffe, ist die relevanten Abschnitte des aktuellen Codes. Ich habe die Swagger-Sachen für den Fall, dass es relevant ist, hinzugefügt. Wenn etwas anderes benötigt wird, lass es mich wissen.

case class EchoPayload(
    message: String, 
    author: String, 
    createdAt: LocalDateTime 
) 

class EchoController(val dataSource: EchoDataSource) { 
    def findById(echoId: Int): Try[EchoPayload] = { 
    dataSource.findById(echoId).map { echo => 
     EchoPayload(echo.message, echo.author.getOrElse("anon"), echo.createdAt) 
    } 
    } 
} 

trait BaseRoute extends ScalatraServlet with JacksonJsonSupport with BaseSwagger { 
    override protected implicit val jsonFormats = DefaultFormats.withBigDecimal 

    before() { 
    contentType = formats("json") 
    } 

    // Error handler, errors translated to Scalatra error ActionResults 
    error { 
    case bre: BadRequestException => BadRequest(ErrorPayload(bre)) 
    case nfe: NotFoundException => NotFound(ErrorPayload(nfe)) 
    case he: HttpException => InternalServerError(ErrorPayload(he)) 
    case NonFatal(e) => InternalServerError(ErrorPayload(e)) 
    } 

} 

class EchoRoute(val controller: EchoController) extends BaseRoute { 

    val getEcho = apiOperation[EchoPayload]("getEcho") 
    .summary("echo echo echo") 
    .notes("returns an echo") 
    .parameters(
     pathParam[Int]("echoId").description("id of the echo to return") 
    ) 
    .responseMessages(
     messageOk("success"), 
     messageBadRequest("invalid echo id"), 
     messageNotFound("no echo yet")) 

    get("/:echoId", operation(getEcho)) { 
    val echoId = Try(params("echoId").toInt).getOrElse(throw new BadRequestException("echoId is required int")) 

    controller.findById(echoId) match { 
     case Success(payload) => Ok(payload) 
     case Failure(e) if e.isInstanceOf[NoEchoException] => throw new NotFoundException(s"No echo at id=$echoId", e) 
     case Failure(e) => throw e 
    } 
    } 
} 
+0

Bitte zeigen Sie uns einige Code. – legendofawesomeness

+0

Code wie gewünscht hinzugefügt –

Antwort

0

Es sieht aus wie Sie json4s für die Formatierung verwenden. Haben Sie sich angeschaut, wie sie extensions unterstützen? Sie scheinen Java8's java.time nicht direkt zu unterstützen, aber sie sollte Joda ziemlich ähnlich sein.

0

Sie könnten einen benutzerdefinierten Serializer hinzufügen. Hinzufügen der folgenden zu Ihrem Umfang hat für mich funktioniert:

object LocalDateTimeSerializer extends CustomSerializer[LocalDateTime](format => (
{ 
    case JString(d) => LocalDateTime.parse(d, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) 
    case JNull => null 
}, 
{ 
    case x: LocalDateTime => JString(x.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) 
} 
)) 

implicit val formats = Serialization.formats(NoTypeHints) + LocalDateTimeSerializer`