У меня есть схема, которая определяется следующим образом:
@JsonDeserialize(using = classOf[ProductDeserializer])
trait GenericProduct{
@JsonUnwrapped
def commonAttributes: CommonAttributes
}
Существуют различные виды продуктов.Например, Продукт А, приведенный ниже, расширяет базовую черту Продукт.Точно так же есть другие продукты B, C, D.
case class ProductA(commonAttributes: CommonAttributes,
extraField1: String,
extraField2: String) extends GenericProduct
Мой метод сериализатора такой:
@Component
class ProductSerializer @Autowired()
(val mapper: ScalaObjectMapper = ObjectMapperSingleton.getMapper) {
def serialize[T<:GenericProduct](product: T)(implicit m: Manifest[T]): String = {
mapper
.writerWithType[T]
.writeValueAsString(product)
}
}
Если я передаю объекты типа A, B, C, D,это работает просто отлично.Сериализованная строка JSON имеет общие атрибуты и специфичные для продукта атрибуты.
Но если я обертываю объекты продукта внутри класса case.Например, из одного метода я возвращаю что-то вроде этого
case class ConsolidatedProducts(newProducts: List[GenericProduct],
oldProducts: List[GenericProduct])
Он не жалуется во время компиляции, но во время выполнения выходные данные имеют только общие атрибуты.
Вопрос: Есть лиэто из-за типа стирания?Если я неявно передам манифест во все места, где вызывается и используется ConsolidatedProducts, то я вижу ожидаемый JSON со всеми атрибутами, что заставляет меня поверить, что это из-за стирания типа.
Найдены два способарешить эту проблему
- Использовать манифест неявно везде для сохранения информации о типе
- Просто обновить
writerWithType[T]
до writerWithType[T.type]
Есть ли другой обходной путь?Я все еще не уверен, почему второе решение работает.Если кто-то может объяснить, это было бы здорово.