我们正在使用Scalatra 2.4和JacksonJsonSupport 3.3,并且在序列化Java8 LocalDateTime时遇到问题。它没有"没有类型为LocalDateTime的构造函数,JObject(List())"
我尝试过一堆搜索以找到解决方案;有许多引用使用JSR-310 ObjectMapper。但是,我还没有找到一种方法将此映射器与Scalatra一起使用。
有人可以指出如何使用Scalatra的Json支持序列化Java8日期时间格式吗?
感谢。
我希望这是当前代码的相关部分。我已经包含了招摇过的东西,以防万一它是相关的。如果需要其他东西,请告诉我。
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 :(得分:0)
您似乎正在使用json4s进行格式化。您是否看过他们如何支持extensions?他们似乎没有直接支持Java8的java.time
,但它应该与Joda非常相似。
答案 1 :(得分: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`