Преобразователь объектов Джексона Скала неправильно сериализует вложенный класс case - PullRequest
0 голосов
/ 04 октября 2018

У меня есть схема, которая определяется следующим образом:

@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 со всеми атрибутами, что заставляет меня поверить, что это из-за стирания типа.

Найдены два способарешить эту проблему

  1. Использовать манифест неявно везде для сохранения информации о типе
  2. Просто обновить writerWithType[T] до writerWithType[T.type]

Есть ли другой обходной путь?Я все еще не уверен, почему второе решение работает.Если кто-то может объяснить, это было бы здорово.

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