0

我有一个控制器处理像'POST / doit'这样的路由,使用Finatra内置工具(Jackson等)将json主体自动解析为案例类,如下所示:

class MyController extends Controller {
  post("/doit") { request: MyRequest =>
    // something
  }
}

case class MyRequest(
  id: String,
  custom: String
)

以下是一些有效的请求:

{ "id": "my id", "custom": "my custom" }

{ "id": "my id", "custom": "{'x': 'y'}" }

如您所见,“自定义”字段可以是无法反序列化的 JSON,因为杰克逊希望它是 POJO 而不是字符串,我尝试用引号将这个 JSON 包装起来,但它们被忽略了,并且该字段被处理为 JSON .

我怎样才能让杰克逊图书馆知道这个字段应该保持简单?

我已经阅读并且我想出的最佳解决方案是编写自定义反序列化器,在这种情况下,我不知道如何与 Finatra 集成。

4

1 回答 1

0

正如“Ryan O'Neill”在Finatra Google Group中指出的那样,在ExampleCaseClasses.scala中有编写自定义反序列化器的示例。

我正在从以前的 scala 源中复制以下代码:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize

case class CaseClassWithCustomDecimalFormat(
  @JsonDeserialize(using = classOf[MyBigDecimalDeserializer])
  myBigDecimal: BigDecimal,
  @JsonDeserialize(using = classOf[MyBigDecimalDeserializer])
optMyBigDecimal: Option[BigDecimal])

class MyBigDecimalDeserializer extends JsonDeserializer[BigDecimal] {
  override def deserialize(jp: JsonParser, ctxt: DeserializationContext): BigDecimal = {
    val jsonNode: ValueNode = jp.getCodec.readTree(jp)
    BigDecimal(jsonNode.asText).setScale(2, RoundingMode.HALF_UP)
  }

  override def getEmptyValue: BigDecimal = BigDecimal(0)
}

谢谢瑞恩。

于 2016-08-29T03:59:39.347 回答