не удается десериализовать jackson scala xml

#scala #serialization #jackson #jackson-module-scala

#scala #сериализация #джексон #jackson-module-scala

Вопрос:

У меня есть следующий код

 @XmlRootElement
@XmlSeeAlso(Array(classOf[EmailNotification],classOf[WebhookNotification]))
abstract class Notification {
}

@XmlRootElement
case class EmailNotification(@BeanProperty var recipients: JList[String],
                             @BeanProperty var subjectTemplate: String) extends Notification {
  def this() = this(new java.util.ArrayList[String](), null)
}
  

Я пытаюсь десериализовать notificationDetails поле из следующего json в список типов уведомлений.

         "notificationDetails":["recipients":["a@b.com"], "subjectTemplate": "hmmm"}],
  

Я получаю следующую ошибку

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of Notification, problem: abstract types can only be instantiated with additional type information
at [Source: org.eclipse.jetty.server.HttpInput@4afa6dff; line: 1, column: 281] (through reference chain: Monitor["monitorRules"]->MonitorRules["notificationDetails"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233)
...

Я пропускаю какие-либо аннотации в своих классах case?

Комментарии:

1. Похоже, вы объявляете notificationDetails как список Notification вместо EmailNotification , и Джексон не может десериализовать его, потому Notification что это абстрактный класс.

2. Ну, я думаю, я пытаюсь реализовать наследование через jackson. Я хочу, чтобы он мог анализировать экземпляр Notification в соответствующий EmailNotification тип (который расширяет notifcation). Я думаю, что это цель @XMLSeeAlso аннотации.

3. Я понимаю. @XMLSeeAlso необходимо включить jackson-module-jaxb-annotations для mapper. Вы можете проверить этот модульный тест для справки и посмотреть, может ли это помочь.