【发布时间】:2023-03-03 03:30:02
【问题描述】:
如标题所述,我无法将 List[A] 编组为正确的 Json(对象数组)。
我正在使用AKKA-Http 和Spray-Json。
我定义了两个案例类:
final case class Item(id: String, pid: String, title: String)
final case class Items(items: List[Item])
在那次电话中GET http://localhost:8080/item 收到了:
class ItemEndpoint extends Directives with ItemJsonSupport {
val route: Route = {
path("item") {
get {
parameters("page".?, "size".?) {
(page, size) => (page, size) match {
case (_, _) =>
onSuccess(Server.requestHandler ? GetItemsRequest){
case response: Items =>
complete(response)
case _ =>
complete(StatusCodes.InternalServerError)
}
}
}
}
}
}
}
GetItemsRequest 被调用。后者定义为
case class GetItemsRequest
和RequestHandler 一样
class RequestHandler extends Actor with ActorLogging {
var items : Items = _
def receive: Receive = {
case GetItemsRequest =>
items = itemFactory.getItems
sender() ! items
}
}
getItems 通过Spark 对Cassandra 执行查询
def getItems() : Items = {
val query = sc.sql("SELECT * FROM mydb")
Items(query.map(row => Item(row.getAs[String]("item"),
row.getAs[String]("pid"), row.getAs[String]("title")
)).collect().toList)
}
返回包含List[Item] 的Items。所有对象都正确打印(其中一些具有空字段)。
使用ItemJsonFormatter
trait ItemJsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
implicit val itemFormat: RootJsonFormat[Item] = jsonFormat3(Item)
implicit val itemsFormat: RootJsonFormat[Items] = jsonFormat1(Items)
}
导致以下错误:
[simple-rest-system-akka.actor.default-dispatcher-9] [akka.actor.ActorSystemImpl(simple-rest-system)] 处理请求时出错:“要求失败”。完成 500 内部服务器错误响应。要更改默认异常处理行为,请提供自定义 ExceptionHandler。 java.lang.IllegalArgumentException:要求失败
我尝试捕获异常并处理它,但我没有获得更多关于该问题的信息。
我关注AKKA DOCS 进行编组。
当做同样的事情,但只得到一项时,它工作得很好,我获得了一个包含所有Item的参数格式良好的json。
{
"id": "78289232389",
"pid": "B007ILCQ8I",
"title": ""
}
即使查看其他相关的 Q/A 我也找不到答案,所以 这是什么原因造成的?我该如何解决?
【问题讨论】:
标签: scala akka marshalling akka-http spray