2016-05-02 3 views
1

Scalatra 2.4でJacksonJsonSupport 3.3を使用しており、Java8 LocalDateTimeのシリアル化に問題があります。 「LocalDateTime、JObject(List())タイプのコンストラクタがありません」というエラーが表示されますScalatraをJava8で使用する方法LocalDateTime

解決方法を探すために多数の検索を試しました。 JSR-310 ObjectMapperを使用することについて多くの言及があります。しかし、Scalatraでこのマッパーを使う方法は見つけていません。

誰かがScalatraのJsonサポートでJava8 datetime形式をシリアル化する方法に関するポインタを与えることができますか?

ありがとうございました。

ここに、私は現在のコードの関連セクションが欲しいです。私はそれが関連している場合に備えて、甘やかされたものを含めました。他に何かが必要なら私に知らせてください。

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

いくつかのコードを表示してください。 – legendofawesomeness

+0

要求通りにコードを追加しました –

答えて

0

フォーマットにはjson4sが使用されているようです。あなたは彼らがどうサポートしているか見てきましたextensions?彼らはJava8のjava.timeを直接サポートしているようには見えませんが、Jodaとよく似ているはずです。

0

カスタムシリアライザを追加できます。あなたのスコープに次のものを追加してくれました。

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` 
関連する問題