在 POST body Finatra 中对多个字段使用 case class 时遇到问题

Trouble using case class for multiple fields in POST body Finatra

我正在处理一个简单的 Finatra API 示例,但是在请求正文中使用多个字段时,无法为 POST 请求使用 case class。

这是我的案例 class 和控制器的示例:

class SaleResource extends Controller {
  post("/sales") { sale: Sale =>
    s"$sale"
  }
}

case class Sale(
                 user: Option[String],
                 streetAddress: Option[String]
               )

我使用以下请求正文向该路由发送 post 请求 JSON:

{
"user": "Foo Barrington",
"streetAddress":"Baz Street"
}

回复: Sale(Some(Foo Barrington),None)

响应显示用户正在被正确反序列化,但由于某种原因我无法填充 streetAddress 字段。

此外,我注意到当我将这些字段中的任何一个设置为 String 而不是 Option[String] 时,我只收到 500 个不成功的响应。

我尝试过的事情:

我总是可以从 Sales 对象访问用户字段,但永远不能访问 streetAddress(或者如果我将测试元素添加到案例 class.

我希望这两个字段都能被识别,因为它们都在请求中提供。总的来说,我是 Scala/Finatra 的新手,所以我可能只是错误地使用了 Finatra 库或 Case classes。

编辑: 似乎将字段名称更改为 mixed/camelcase 可以解决所有问题,但这似乎是一种奇怪的行为。

Finatra 在幕后使用 Jackson 库。默认配置使用 PropertyNamingStrategy.SNAKE_CASE,看起来像:

{
  "user": "Foo Barrington",
  "street_address":"Baz Street"
}

您需要将其更改为 PropertyNamingStrategy.LOWER_CAMEL_CASE 才能解析 JSON。 为此,您需要定义自定义 FinatraJacksonModule 并告诉应用程序 使用它。

object CustomFinatraJacksonModule extends FinatraJacksonModule {
  override val propertyNamingStrategy = PropertyNamingStrategy.LOWER_CAMEL_CASE
}



class MyFinatraHttpServer extends HttpServer {
  override protected def jacksonModule: Module = CustomFinatraJacksonModule
}

Jackson Integration 提供有关该主题的更多信息。