我有一个定义如下的模式
@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,这使我相信这是由于类型擦除引起的。
找到了两种解决方法
writerWithType[T]
更新为writerWithType[T.type]
还有其他解决方法吗?我仍然不确定为什么第二种解决方案有效。如果有人可以解释,那就太好了。