我有一组已重构为另一个包的事件。在我执行事件重播之前,这会一直有效。深入挖掘,我注意到 domainevententry 表中的有效载荷类型,改变它就足够了,但似乎事件的 xml 根元素也需要更改。我希望有一种简单的方法可以做到这一点。
我找不到任何关于向上转换到不同包或使用 XStream 别名的示例,因此将不胜感激任何帮助。
谢谢
答案 0 :(得分:3)
如您所见,存储在事件中的默认负载类型是完全限定的类名。这确保开箱即用的序列化和反序列化按预期工作。然而,移动类因此意味着无法再找到有效载荷类型,需要进行一些调整。
您可以使用 EventTypeUpcaster
,如 Reference Guide 中所述。 EventTypeUpcaster
专用于调整负载类型,因此也可用于处理更改包名称。
当使用(默认)XStreamSerializer
时,标签别名确实也有效。例如如何设置别名可以参见here。在该示例中注意到,别名已添加到 XStream
实例。 XStreamSerializer
使用 XStream
实例来支持从/到 XML 的反/序列化。要调整 XStream
实例,您可以简单地在 XStreamSerializer
上使用构建器范例。 JavaDoc of the builder 应该足够具体以帮助您了解如何使用它。
答案 1 :(得分:0)
在这方面走了很长一段路,但似乎有效。与往常一样,在执行大量更改之前备份数据库。我还在完成时使用数据库重新启动了服务。不用说,在下次部署之前,我会确保事件在逻辑包中:)
数据库引擎:Postgres 10
表格:domainevententry
update domainevententry
set
payloadtype = '<new.package.Classname>',
payload = lo_from_bytea(0, decode(REPLACE(
subquery.output,
'<old.package.Classname>',
'<new.package.Classname>'
), 'escape'))
from (
SELECT eventidentifier, payloadtype, encode(lo_get(payload::oid), 'escape') as output FROM domainevententry
WHERE eventidentifier in (
'<event guid 1>',
'<event guid 2>'
)
AND payloadtype = '<old.package.Classname>'
) as subquery
where domainevententry.eventidentifier = subquery.eventidentifier;
完成后,我需要更新大对象的所有者:
ALTER LARGE OBJECT <LargeObjectId> OWNER TO database_role;
可能不是最优雅的解决方案,但基于我的时间限制,它完成了工作。对于大对象,此解决方案可能存在编码问题,但最终对我来说都解决了。随意分享任何可以使上述更合适的优化。
启动 Axon 框架重放重建了投影和所有内容。