спрей-json в Http().bindAndHandle

В настоящее время я просматриваю документацию и примеры akka-http. Я застрял, вероятно, на чем-то очень тривиальном: передаче конфигурации маршрута с директивами и JsonSupport. Я слежу за документацией по введению. и json-поддержка

Для JsonSupport мне нужно создать класс, расширяющий akka.http.scaladsl.server.Directives:

class RouteDef extends Directives with JsonSupport {

с JsonSupport определенным мной:

trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {

Как я могу теперь использовать этот класс в:

val bindingFuture = Http().bindAndHandle(new RouteDef().route, "localhost", 8082)

Маршаллинг json не работает, так как поддержка json не подключена к маршруту val (я подозреваю).

Отдельный вопрос: Каков статус spray-json? Спрей больше не поддерживается, будет ли спрей-json по-прежнему поддерживаться или заменяться, например, Джексоном?


person dr jerry    schedule 03.12.2016    source источник
comment
Не могли бы вы поделиться кодом двух признаков и ошибкой, которую вы получаете?   -  person Stefano Bonetti    schedule 03.12.2016


Ответы (1)


Я попробовал пример на странице поддержки json, и он работает, как и ожидалось.

// domain model
final case class Item(name: String, id: Long)
final case class Order(items: List[Item])

// collect your json format instances into a support trait:
trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
  implicit val itemFormat = jsonFormat2(Item)
  implicit val orderFormat = jsonFormat1(Order) // contains List[Item]
}

// use it wherever json (un)marshalling is needed
class MyJsonService extends Directives with JsonSupport {

  val route =
  get {
    pathSingleSlash {
      complete(Item("thing", 42)) // will render as JSON
    }
  } ~
    post {
      entity(as[Order]) { order => // will unmarshal JSON to Order
        val itemsCount = order.items.size
        val itemNames = order.items.map(_.name).mkString(", ")
        complete(s"Ordered $itemsCount items: $itemNames")
      }
    }
}

object Main extends App {
  implicit val system = ActorSystem("main")
  implicit val materializer = ActorMaterializer()

  Http().bindAndHandle(new MyJsonService().route, "localhost", 8080)
}

И результат:

~❯ curl http://127.0.0.1:8080/
{"name":"thing","id":42}%
~❯ curl -H "Content-Type: application/json" -X POST -d '{"items":[{"name":"thing2","id":43}]}' http://localhost:8080
Ordered 1 items: thing2%

Так что это должно работать, если вы не пропустили что-то вроде неявного определения system или materializer. В обзоре route-dslописано следующим образом:

Преобразование из Route в поток может быть вызвано явно с помощью Route.handlerFlow или, в противном случае, преобразование также обеспечивается неявно с помощью RouteResult.route2HandlerFlow.

Если это проблема, возможно, вам также следует проверить этот документ.

Что касается спрея-json, я не знаю, будет ли он поддерживаться. Но поскольку это упрощенная реализация JSON и довольно стабильная на данный момент, вряд ли в ней произойдут большие изменения в будущем.

И, конечно же, если вы хотите использовать маршалер Джексона, не так уж сложно создать свой собственный, например это.

person XoYo24    schedule 13.12.2016