DynamoDB抽象类使用DynamoDBTypeConvertedJson的可行性咨询
DynamoDB抽象类属性使用
DynamoDBTypeConvertedJson的问题解答 直接注解的运行效果
你当前的写法无法完整正常运行,分两个执行阶段看:
- 写入DynamoDB的序列化阶段:不会报错。因为写入时
a字段的实际值是B或者C的具体实例,默认JSON转换器会把实例的实际属性全部序列化成JSON字符串存入库中。 - 读取DynamoDB的反序列化阶段:必然报错。因为转换器读取时只知道字段的声明类型是抽象类
A,没有额外类型信息的情况下,底层的Jackson序列化器既不能直接实例化抽象类,也无法判断当前JSON应该映射到B还是C子类,会直接抛出实例化/类型匹配异常。
该写法是否为推荐方案
绝对不推荐在生产环境使用。
哪怕你通过给A类添加Jackson多态注解(比如@JsonTypeInfo)临时解决反序列化问题,也会留下严重的维护隐患:这种方案会把Java类名、类结构信息硬编码到存储的JSON数据中,后续如果做类重命名、包路径调整、子类拆分等重构操作,所有历史存储的数据都会无法反序列化,修复成本极高。
可行的正确实现方式
你确实需要自定义DynamoDBTypeConverter实现转换逻辑,但不建议硬写instanceOf判断分支,更稳妥的实现思路如下:
- 定义统一的存储结构:存入DynamoDB的JSON包含两部分,一部分是子类类型标识(比如自定义枚举值,
B对应"typeB"、C对应"typeC",不要直接存Java全类名),另一部分是具体子类的属性内容,格式类似{"objType":"typeB", "attributes":{"attOfB":"test"}} - 序列化逻辑:判断传入的
A子类实例类型,写入对应的类型标识,再将实例属性序列化成JSON,按上述结构拼接后存入DynamoDB。 - 反序列化逻辑:先解析出存储JSON里的
objType字段,根据类型值匹配到要转换的目标具体子类(B/C),再把attributes部分的内容反序列化成对应子类实例返回。
如果你的业务里A的子类长期固定只有B、C两个,短期用instanceOf判断类型也能跑通逻辑,但后续新增子类时必须同步修改转换器代码,扩展性较差。
内容的提问来源于stack exchange,提问作者Vegan Vegeta
相关产品推荐
相关产品推荐

