无法 JSON 使用 AKKA-Http 和 Spray-Json 将 B 定义为列表 [A]
Unable to JSON Marshal B defined as List[A] using AKKA-Http and Spray-Json
如标题所述,我无法将 List[A]
编组到正确的 Json(对象数组)中。
我正在使用 AKKA-Http and 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)] Error during processing of request: 'requirement failed'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
java.lang.IllegalArgumentException: requirement failed
我尝试捕获异常并对其进行处理,但我还没有获得有关该问题的更多信息。
我关注 AKKA DOCS 编组。
当做同样的事情,但只得到 1 个项目时,它工作得很好,我得到一个 json,其中包含格式正确的所有 Item
参数。
{
"id": "78289232389",
"pid": "B007ILCQ8I",
"title": ""
}
即使看了其他相关的 Q/A 我也找不到答案,所以
这是什么原因造成的?我该如何解决?
All the objects are printed correctly (some of them have null fields).
可能会抛出异常,因为 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)
}
如标题所述,我无法将 List[A]
编组到正确的 Json(对象数组)中。
我正在使用 AKKA-Http and 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)] Error during processing of request: 'requirement failed'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler. java.lang.IllegalArgumentException: requirement failed
我尝试捕获异常并对其进行处理,但我还没有获得有关该问题的更多信息。
我关注 AKKA DOCS 编组。
当做同样的事情,但只得到 1 个项目时,它工作得很好,我得到一个 json,其中包含格式正确的所有 Item
参数。
{
"id": "78289232389",
"pid": "B007ILCQ8I",
"title": ""
}
即使看了其他相关的 Q/A 我也找不到答案,所以 这是什么原因造成的?我该如何解决?
All the objects are printed correctly (some of them have null fields).
可能会抛出异常,因为 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)
}