在 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 个不成功的响应。
我尝试过的事情:
- case 语句匹配
Some(streetAddress)
到该字段字符串值或 "none found" 当它是 None
。在这些情况下,它仍然说 streetAddress
是 None
而不是。
- 同时使用
curl
和 Postman 发出请求。
我总是可以从 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 提供有关该主题的更多信息。
我正在处理一个简单的 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 个不成功的响应。
我尝试过的事情:
- case 语句匹配
Some(streetAddress)
到该字段字符串值或 "none found" 当它是None
。在这些情况下,它仍然说streetAddress
是None
而不是。 - 同时使用
curl
和 Postman 发出请求。
我总是可以从 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 提供有关该主题的更多信息。