Jackson Scala对象映射器未正确序列化嵌套案例类

时间:2018-10-04 00:44:15

标签: scala serialization jackson jackson-databind

我有一个定义如下的模式

@JsonDeserialize(using = classOf[ProductDeserializer])
trait GenericProduct{
  @JsonUnwrapped
  def commonAttributes: CommonAttributes
}

有不同种类的产品。例如,下面给出的产品A扩展了基本特征产品。同样,还有其他产品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])

在编译时不会抱怨,但在运行时输出仅具有公共属性。

问题:这是由于类型擦除引起的吗? 如果我将清单隐式传递到调用和使用solidatedProducts的所有位置,那么我可以看到带有所有属性的预期JSON,这使我相信这是由于类型擦除引起的。

找到了两种解决方法

  1. 在各处隐式使用清单以保留类型信息
  2. 只需将writerWithType[T]更新为writerWithType[T.type]

还有其他解决方法吗?我仍然不确定为什么第二种解决方案有效。如果有人可以解释,那就太好了。

0 个答案:

没有答案