将Jackson混合与ValueInstantiator结合

时间:2018-10-21 09:36:48

标签: json scala jackson jackson-module-scala

这是此问题的后续内容:Jackson annotation mixin on some of the fields doesn't work

我想反序列化以下类:

case class Target(
                   a: Option[Long],
                   b: String
                 )

同时为缺少的字段提供自定义初始值。

我正在使用此mixin来克服以下错误:https://github.com/FasterXML/jackson-module-scala/wiki/FAQ#deserializing-optionint-and-other-primitive-challenges

trait Mixin {
   @JsonDeserialize(contentAs = classOf[Long]) def a: Option[Long]
}

并且我正在使用此ValueInstantiator提供自定义初始值:

class TargetInstantiator extends ValueInstantiator{
  override def canCreateUsingDefault: Boolean = true

  override def createUsingDefault(ctxt: DeserializationContext): AnyRef = {
    Target(Some(1), "bbb")
  }
}

混合和实例化器可以单独很好地工作,但是当我将2组合在一起时,mixin似乎没有任何作用

这是完整的代码:

case class Target(
                   a: Option[Long],
                   b: String
                 )
trait Mixin {
  @JsonDeserialize(contentAs = classOf[Long]) def a: Option[Long]
}

class TargetInstantiator extends ValueInstantiator{
  override def canCreateUsingDefault: Boolean = true

  override def createUsingDefault(ctxt: DeserializationContext): AnyRef = {
    Target(Some(1), "bbb")
  }
}


val svi = new SimpleValueInstantiators()
svi.addValueInstantiator(classOf[Target], new TargetInstantiator)

val module = new SimpleModule("MyModule")
module.setValueInstantiators(svi)

val mapper = new ObjectMapper()
  .registerModule(DefaultScalaModule)
  .registerModule(module)
  .addMixIn(classOf[Target], classOf[Mixin])
val req =
  """{
    |  "a": 123
    |}
  """.stripMargin
val res = mapper.readValue(req, classOf[Target])
println(res.a.map(_ + 1)) //should print Some(124)
println(res.b) //should print "bbb"

以上代码将因错误而失败

  

java.lang.Integer无法转换为java.lang.Long

在第一张纸上。

如果我注释掉.registerModule(module),并将"b"添加到json字符串中,则代码将起作用。

是否可以使mixin和实例化器一起工作?

0 个答案:

没有答案