0

我正在研究一个简单的 Finatra API 示例,但是在请求正文中使用多个字段时,无法为 POST 请求使用案例类。

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

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

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

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

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

响应: Sale(Some(Foo Barrington),None)

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

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

我尝试过的事情:

  • Some(streetAddress)匹配该字段字符串值或“未找到”的case 语句,当它是None. 在这些情况下,它仍然在说它streetAddress不是None
  • curl向邮递员和邮递员提出请求。

我总是可以从Sales对象访问用户字段,但streetAddress如果我将测试元素添加到案例类,则永远不能访问(或请求正文中的任何其他字段)。

我希望这两个字段都能被识别,因为它们都在请求中提供。一般来说,我对 Scala/Finatra 比较陌生,所以我可能只是错误地使用了 Finatra 库或 Case 类。

编辑:似乎将字段名称更改为不混合/驼峰式可以解决所有问题,但这似乎是奇怪的行为。

4

1 回答 1

1

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提供了有关该主题的更多信息。

于 2019-09-19T12:05:42.737 回答