无法使用AKKA-Http和Spray-Json

时间:2017-07-27 12:18:29

标签: scala akka marshalling akka-http spray

如标题所述,我无法将List[A]编组到正确的Json(对象数组)中。

我正在使用AKKA-HttpSpray-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

即使查看其他相关的问答,我也无法找到答案 导致这种情况的原因是什么?我该如何解决?

1 个答案:

答案 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)
}