scala - 在 POST 正文 Finatra 中为多个字段使用案例类时遇到问题
问题描述
我正在研究一个简单的 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 类。
编辑:似乎将字段名称更改为不混合/驼峰式可以解决所有问题,但这似乎是奇怪的行为。
解决方案
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提供了有关该主题的更多信息。
推荐阅读
- image - 在 Flutter 中将 CameraImage 转换为 ui.Image
- jenkins - 如何正确使用 Jenkins Warnings Next Generation Plugin 的三个步骤?
- html - .htaccess 用于内容语言
- python - 我可以通过 Buildozer 从 opencv-contrib-python 导入类以进行人脸识别吗?
- python - 如何通过视图在路径中插入 django 用户的用户名?
- c# - 缺少类型“字符”使用指令或程序集参考-SharpFont/Freetype
- angular - angular cli 必须使用 import 加载 ES 模块
- django - 无法查询“”:必须是“”实例
- asp.net - 为什么我的表格没有根据 MVC 中的下拉菜单显示我想要的结果?
- python - Python列表迭代/添加