Совместите смешивание Джексона с ValueInstantiator - PullRequest
0 голосов
/ 21 октября 2018

это продолжение этого вопроса: Миксин Джексона для некоторых полей не работает

Я бы хотел десериализовать следующий класс:

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, код сработает.

Можно ли заставить миксин и инстанциатор работать вместе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...