как установить ответ с CamelCase в Finatra - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужно вернуть json ответ в camelCase с finatra, но он по умолчанию находится в snake_case. Из того, что я нашел до сих пор, мне нужно использовать ObjectMapper, но я не могу понять, куда мне его передать, когда я его создаю. Пример был бы очень полезен. Вот что у меня есть:

import com.twitter.finagle.http.Request
import com.twitter.finatra.http.Controller

class myTargetingController extends Controller {
    val endpoint = "http://....."

    get(s"$endpoint/?") { request: Request =>
        // what do I do with it?
        // val objectMapper = ScalaObjectMapper.builder.camelCaseObjectMapper 
        response.ok.json(myObject)
    }
}

================================== ===============================

import com.twitter.finagle.{Service, SimpleFilter}
import com.twitter.finagle.http.{ Request, Response}
import com.twitter.finatra.http.routing.HttpRouter
import com.twitter.finatra.http.{HttpServer}
import com.twitter.finatra.http.filters.CommonFilters
import com.twitter.util.Future

object MyServerApp extends MyServer

class MyServer extends HttpServer {
override protected def configureHttp(router: HttpRouter) {
    router
        .filter[CommonFilters]
        .add[CorsFilter, MyController]
    }
}

PS Я очень-очень новичок в Scala

1 Ответ

0 голосов
/ 28 апреля 2020

Следуя комментариям

Определите пользовательский ObjectMapperModule

class CamelCaseModule extends ScalaObjectMapperModule {

    override val propertyNamingStrategy: PropertyNamingStrategy =
      new PropertyNamingStrategy.UpperCamelCaseStrategy

    override def additionalMapperConfiguration(mapper: ObjectMapper): Unit = {
      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true)
 }
}

Переопределите модуль Джексона по умолчанию для вашего сервера

override def jacksonModule = new CamelCaseModule

Убедитесь, что у вас есть

"com.twitter" %% "finatra-jackson" % yourFinatraVersion % "test"

в вашем build.sbt

И что вы импортируете

import com.fasterxml.jackson.databind.{DeserializationFeature, Module, ObjectMapper, PropertyNamingStrategy}
import com.twitter.finatra.jackson.modules.ScalaObjectMapperModule

Локально протестировано и, кажется, работает. Надеюсь, это поможет

...