(По сути, мне нужен какой-то синтез этих двух вопросов ( 1 , 2 ), но я не достаточно умен, чтобы объединить их сам.)
У меня есть набор представлений JAXB в Scala, например:
abstract class Representation {
def marshalToXml(): String = {
val context = JAXBContext.newInstance(this.getClass())
val writer = new StringWriter
context.createMarshaller.marshal(this, writer)
writer.toString()
}
}
class Order extends Representation {
@BeanProperty
var name: String = _
...
}
class Invoice extends Representation { ... }
Проблема, с которой я сталкиваюсь, заключается в моих методах «конструктора», не использующих маршалинг:
def unmarshalFromJson(marshalledData: String): {{My Representation Subclass}} = {
val mapper = new ObjectMapper()
mapper.getDeserializationConfig().withAnnotationIntrospector(new JaxbAnnotationIntrospector())
mapper.readValue(marshalledData, this.getClass())
}
def unmarshalFromXml(marshalledData: String): {{My Representation Subclass}} = {
val context = JAXBContext.newInstance(this.getClass())
val representation = context.createUnmarshaller().unmarshal(
new StringReader(marshalledData)
).asInstanceOf[{{Type of My Representation Subclass}}]
representation // Return the representation
}
В частности, я могуНе могу понять, как прикрепить эти методы демаршаллинга безопасным и сухим способом к каждому из моих классов, а затем вызвать их из Scala (и, надеюсь, иногда, используя только абстрактную информацию о типах).Другими словами, я хотел бы сделать это:
val newOrder = Order.unmarshalFromJson(someJson)
И более амбициозно:
class Resource[R <: Representation] {
getRepresentation(marshalledData: String): R =
{{R's Singleton}}.unmarshalFromXml(marshalledData)
}
С точки зрения моих конкретных камней преткновения:
- Я не могу понять, должен ли я определять свои конструкторы
unmarshalFrom*()
один раз в классе Representation
или в одноэлементном Representation
объекте - если последний, я не вижу, как я могу автоматически наследовать это черезиерархия классов Order
, Invoice
и т. д. - Я не могу заставить
this.type
( согласно этому ответу ) работать как способ самонабора unmarshalFromJson()
- Я получаю ошибку компиляции type mismatch; found: ?0 where type ?0 required: Representation.this.type
на readValue()
вызове - Я не могу понять, как использовать неявный шаблон
Default[A]
( согласно этому ответу ) для работывниз по моей иерархии классов представления для вызова одноэлементных демаршаллинговых конструкторов, использующих только информацию о типе
Я знаю, что это немного гигантский вопрос, касающийся различных (но связанных) вопросов - любая помощь будет с благодарностью получена!
Алекс