【问题标题】:Axon Event Deserialization Issue?Axon 事件反序列化问题?
【发布时间】:2021-03-13 07:47:05
【问题描述】:

我有一个事件源聚合并使用 Jackson 作为事件序列化器。现在,当我在命令处理程序中应用事件 A 时,我可以看到它是立即调用的事件源处理程序,以及所有预期的事件字段(事件与我在命令处理程序中创建的实例相同)。事件中的字段之一是 aggregateId。

但是,当调用(读取端)事件处理程序时,事件对象是一个不同的实例,但是我用aggregateId填充的字段值错误!调试显示它填充了事件标识符。当我在事件构造函数中设置断点时,我看到它被调用并且设置了错误的字段值。

当我切换到 XStream 作为事件序列化程序时,一切都很好。没有做额外的偶数实例化,在命令处理程序中创建的事件与在事件处理程序中处理是一样的。

这是怎么回事?

【问题讨论】:

    标签: axon axon-framework


    【解决方案1】:

    经过一个小时的调试,我发现了自己的错误;-)。作为 Axon 文档 say,当使用 Jackson 作为 EventSerializer 时,您必须遵守 Jackson conventions,而我没有这样做。我所有的聚合 id 都是这个 AggregateId 的子类:

    public abstract class AggregateId {
    
        private final UUID id;
    
        public AggregateId() {
            this(UUID.randomUUID());
        }
    
        public AggregateId(UUID id) {
            this.id = id;
        }
    
        public String toString() {
            return id.toString();
        }
    
        public UUID getValue() {
            return id;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            AggregateId that = (AggregateId) o;
            return id.equals(that.id);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
    }
    

    拥有一个没有 getter 的私有字段 id 和一个返回该 id 的 getValue 是愚弄杰克逊(和我自己)的完美方式。

    id 重命名为value 后,所有测试都是绿色的。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多