Являясь новичком как scala, так и akka-http, я пытаюсь подключиться к процессу сериализации aka marshalling.
В проекте используются [email protected] и [email protected] ". Кроме того, в него включена зависимость akka-http-spray-json
.
В кодовой базе мы используем Java.Util.Currency
(это может быть устаревшим, что не важно, поскольку я все еще хотел бы знать, как добавить настраиваемый маршаллер).
Учитывая этот пример контроллера:
def getCurrencyExample: Route = {
path("currencyExample") {
val currency: Currency = Currency.getInstance("EUR")
val code: String = currency.getCurrencyCode
val shouldBeFormated = collection.immutable.HashMap(
"currencyCode" -> code,
"currencyObject" -> currency
)
complete(shouldBeFormated)
}
}
Я получаю такой ответ, когда объект валюты становится пустым:
{
currencyObject: { },
currencyCode: "EUR",
}
Я ожидаю что-то вроде:
{
currencyObject: "EUR",
currencyCode: "EUR",
}
Объект currency
должен быть преобразован в строку JSON. И так как я не хочу преобразовывать каждый ответ вручную, я хочу подключиться к процессу сортировки и сделать это в фоновом режиме.
Я хочу добавить настраиваемый marhaller только для объектов Java.Util.Currency
, но даже прочитав документы, я очень не уверен, как это сделать. Существует несколько подходов, и я не уверен, что подходит мне, или с чего начать.
Я попытался создать свой собственный CurrencyJsonProtocol
:
package com.foo.api.marshallers
import java.util.Currency
import spray.json.{DefaultJsonProtocol, JsString, JsValue, RootJsonFormat}
object CurrencyJsonProtocol extends DefaultJsonProtocol {
implicit object CurrencyJsonFormat extends RootJsonFormat[Currency] {
override def read(json: JsValue): Currency = {
Currency.getInstance(json.toString)
}
override def write(obj: Currency): JsValue = {
JsString(obj.getCurrencyCode)
}
}
}
но простое существование файла ломает мой проект:
[error] RouteDefinitons.scala:90:16: type mismatch;
[error] found : scala.collection.immutable.HashMap[String,java.io.Serializable]
[error] required: akka.http.scaladsl.marshalling.ToResponseMarshallable
[error] complete(shouldBeFormated)
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
и я понятия не имею, почему. (Это сбой из-за того, что мое имя пакета называется marshaller
. Это полностью нарушило компиляцию проекта.