如标题所述,我无法将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
通过Cassandra
Spark
执行查询的位置
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)
}
返回包含Items
的{{1}}。正确打印所有对象(其中一些对象具有空字段)。
使用List[Item]
ItemJsonFormatter
导致以下错误:
[simple-rest-system-akka.actor.default-dispatcher-9] [akka.actor.ActorSystemImpl(simple-rest-system)]处理请求时出错:'要求失败'。完成500内部服务器错误响应。要更改默认的异常处理行为,请提供自定义的ExceptionHandler。 java.lang.IllegalArgumentException:要求失败
我尝试捕捉异常并继续处理,但我还没有获得更多关于此问题的情报。
我在编组时跟着AKKA DOCS。
当做同样的事情,但只获得1个项目时,它工作正常,我获得了一个包含所有trait ItemJsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
implicit val itemFormat: RootJsonFormat[Item] = jsonFormat3(Item)
implicit val itemsFormat: RootJsonFormat[Items] = jsonFormat1(Items)
}
参数格式良好的json。
Item
即使查看其他相关的问答,我也无法找到答案 导致这种情况的原因是什么?我该如何解决?
答案 0 :(得分:1)
正确打印所有对象(其中一些对象具有空字段)。
可能抛出异常,因为getItems
正在返回具有一个或多个空字段值的Item
个对象。
处理此问题的一种方法是用空字符串替换空值:
def rowToItem(row: Row): Item = {
Item(Option(row.getAs[String]("item")).getOrElse(""),
Option(row.getAs[String]("pid")).getOrElse(""),
Option(row.getAs[String]("title")).getOrElse(""))
}
def getItems(): Items = {
val query = sc.sql("SELECT * FROM mydb")
Items(query.map(row => rowToItem(row)).collect().toList)
}