это продолжение этого вопроса: Миксин Джексона для некоторых полей не работает
Я бы хотел десериализовать следующий класс:
case class Target(
a: Option[Long],
b: String
)
при предоставлении пользовательского начального значения для пропущенных полей.
Я использую этот миксин для устранения этой ошибки: 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 вместе, миксин, кажется, не оказывает никакого влияния
вот полный код:
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, код сработает.
Можно ли заставить миксин и инстанциатор работать вместе?