编写上下文感知升级器:如何从IntermediateEventRepresentation提取事件数据
解决IntermediateEventRepresentation提取事件数据的报错问题
针对你在Axon Framework上下文感知升级器中遇到的问题,核心是没搞清楚IntermediateEventRepresentation和SerializedObject的API用法:
错误原因分析
- 第一种写法
intermediateRepresentation.data.data:intermediateRepresentation.data返回的是SerializedObject,它的getData()方法返回的是序列化后的原始数据载体(比如字节数组、JSON字符串这类序列化格式的原始内容),不是你要的MyEventType实例,所以类型不匹配报错。 - 第二种写法
intermediateRepresentation.getData(MyEventType::class.java).data:intermediateRepresentation.getData(MyEventType::class.java)已经直接返回反序列化后的MyEventType实例了,你再调用.data相当于在MyEventType对象上找不存在的属性,自然报错。
正确写法
直接通过getData(Class<T>)方法获取目标事件类型实例即可:
class MyUpcaster : ContextAwareSingleEventUpcaster<Context>() { override fun doUpcast(intermediateRepresentation: IntermediateEventRepresentation, context: Context): IntermediateEventRepresentation { // 直接获取反序列化后的MyEventType实例 val eventData: MyEventType = intermediateRepresentation.getData(MyEventType::class.java) // 后续可将eventData存入上下文,示例: context.put("eventData", eventData) // 别忘了返回修改后的(或原有的)中间事件表示 return intermediateRepresentation } }
如果需要手动处理SerializedObject(比如自定义反序列化逻辑),可以用SerializedObject的object属性获取实例:
val serializedObject: SerializedObject<*> = intermediateRepresentation.data val eventData: MyEventType = serializedObject.object as MyEventType
额外注意
确保你的MyEventType已经正确配置了Axon的序列化器(比如Jackson、XStream),否则反序列化时会抛出类型转换或序列化异常。
内容的提问来源于stack exchange,提问作者Providen
相关产品推荐
相关产品推荐

