как установить ответ с camelCase в finatra

Мне нужно вернуть ответ json в camelCase с помощью finatra, но по умолчанию он находится в змее_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]
    }
}

P.S. Я очень-очень новичок в Scala


person chibis    schedule 27.04.2020    source источник
comment
Вы не можете использовать это в конечной точке вот так. Вам нужно обернуть логику в TwitterModule и привязать этот модуль к вашему серверу, чтобы он правильно вводился. Возможно, было бы проще использовать ScalaObjectMapperModule в целом.   -  person sinanspd    schedule 28.04.2020
comment
не могли бы вы привести пример. Как я уже сказал, я очень новичок в Scala, и в том, что вы сказали, много неизвестного :)   -  person chibis    schedule 28.04.2020
comment
Мне нужно загрузить один из моих старых проектов finatra, чтобы убедиться, что мой пример работает, я не хочу давать вам код, который я не проверял. Так что вам придется подождать, пока я не вернусь домой. А пока ознакомьтесь с модулями Finatra, пожалуйста. Это прояснит все эти неизвестные twitter.github.io/finatra/ руководство пользователя/приступая к работе/   -  person sinanspd    schedule 28.04.2020


Ответы (1)


Вдогонку к комментариям

Определите пользовательский 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

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

person sinanspd    schedule 28.04.2020
comment
Большое спасибо за ваше время и усилия. К сожалению, я не понимаю, куда это должно идти. Я отредактировал свой пост, чтобы включить больше моей текущей настройки. Пожалуйста, дайте мне знать, если мне нужно добавить больше информации. Благодарю вас! - person chibis; 28.04.2020
comment
@chibis CamelCaseModule может идти куда угодно, пока MyServer может ссылаться на него, вторая строка jacksonModule будет идти в MyServer перед configureHttp - person sinanspd; 28.04.2020
comment
Обновил ответ с необходимым импортом @chibis - person sinanspd; 28.04.2020
comment
Думаю, я понял. Я положил его в override def jacksonModule: Module = new CamelCaseModule в myServer классе. Пришлось изменить override val propertyNamingStrategy: PropertyNamingStrategy = PropertyNamingStrategy.LOWER_CAMEL_CASE, чтобы он соответствовал моим требованиям. И это работает. Большое спасибо @sinanspd!!!! Сегодня целый день пытался разобраться - person chibis; 28.04.2020