我正在尝试编写一个插入 Play Framework 控制器的 JSON 反序列化器,以代替标准的 Play JSON 库。理由是能够直接使用杰克逊。多亏了 Maarten Winkels 的食谱,我已经能够想出一个可插入的反序列化器,但是由于我不理解的编译错误而被卡住了(免责声明:我是 Scala 新手)。
编译错误源于这样一个事实,显然一个分支JsonObjectParser.apply
试图返回一个实例Object
,而它应该是Result
。我不明白为什么会这样。我的问题是,我该如何解决这个错误?
编译错误
编译错误如下所示:
/Users/arve/Projects/test/JsonObjectParser.scala:26: type mismatch;
[error] found : Object
[error] required: play.api.mvc.Result
[error] case Left((r, in)) => Done(Left(r), El(in))
JsonObjectParser.scala
这是有问题的源代码:
import java.io.{ByteArrayInputStream, InputStream}
import play.api.Play
import play.api.libs.iteratee.Input._
import play.api.libs.iteratee._
import play.api.mvc._
import scala.concurrent.ExecutionContext.Implicits.global
class JsonObjectParser[A: Manifest](deserializer: (InputStream) => A) extends BodyParser[A] {
val JsonMaxLength = 4096
def apply(request: RequestHeader): Iteratee[Array[Byte], Either[Result, A]] = {
Traversable.takeUpTo[Array[Byte]](JsonMaxLength).apply(Iteratee.consume[Array[Byte]]().map { bytes =>
scala.util.control.Exception.allCatch[A].either {
deserializer(new ByteArrayInputStream(bytes))
}.left.map { e =>
(Play.maybeApplication.map(_.global.onBadRequest(request, "Invalid Json")).getOrElse(
Results.BadRequest), bytes)
}
}).flatMap(Iteratee.eofOrElse(Results.EntityTooLarge))
.flatMap {
case Left(b) => Done(Left(b), Empty)
case Right(it) => it.flatMap {
// Won't compile
case Left((r, in)) => Done(Left(r), El(in))
case Right(a) => Done(Right(a), Empty)
}
}
}
}
或者,
如果你们知道在 Jackson 之上将自定义 JSON 反序列化器插入 Play 的更好方法,那也是可以接受的。毕竟,这就是我要在这里做的事情。