#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. Вы можете проверить этот модульный тест для справки и посмотреть, может ли это помочь.