无法 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)
}