在事件存储中找不到聚合

aggregate not found in the event store

我正在尝试使用 CQRS 框架 AXON 添加数据。但是同时点击 API(用于添加订单)。我收到以下错误:-

Command 'com.cqrs.order.commands.CreateOrderCommand' resulted in org.axonframework.modelling.command.AggregateNotFoundException(The aggregate was not found in the event store)

但我的代码中已经有一个聚合 (OrderAggregate.Java)。

完整代码可以在 - https://github.com/iftekharkhan09/OrderManagementSystem

找到

API 添加订单 - http://localhost:8080/confirmOrder

请求正文:-

{
    "studentName":"Sunny Khan"
}

谁能告诉我我哪里做错了? 感谢您的帮助!

对于其他读者,让我分享您在存储库中创建的聚合:

@Aggregate
public class OrderAggregate {
    public OrderAggregate(OrderRepositoryData orderRepositoryData) {
        this.orderRepositoryData = orderRepositoryData;
    }

    @AggregateIdentifier
    private Integer orderId;

    private OrderRepositoryData orderRepositoryData;

    @CommandHandler
    public void handle(CreateOrderCommand command) {
        apply(new OrderCreatedEvent(command.getOrderId()));
    }

    @EventSourcingHandler
    public void on(OrderCreatedEvent event) {
        this.orderId=event.getOrderId();
        Order order=new Order("Order New");
        orderRepositoryData.save(order);
    }

    protected OrderAggregate() {
        // Required by Axon to build a default Aggregate prior to Event Sourcing
    }

}

您可以从此聚合中完全删除几项内容,它们是:

  1. OrderRepositoryData
  2. 设置OrderRepositoryData
  3. OrderAggregate构造函数
  4. @EventSourcingHandler注解函数
  5. 中手动保存一个Order

您在这里所做的是将命令模型的决策关注与为查询模型创建可查询的 Order 混合起来。最好从聚合(您的示例中的命令模型)中完全删除此逻辑并将其移至事件处理组件。

然而,这并不是您收到 AggregateNotFoundException 的罪魁祸首。 您错过的是使 CreateOrderCommand 命令处理程序成为构造函数。

CreateOrderCommand 将创建一个订单,正如其名称所暗示的那样。 因此,它应该由构造函数而不是常规方法来处理。 所以,而不是这个:

    @CommandHandler
    public *void* handle(CreateOrderCommand command) {
        apply(new OrderCreatedEvent(command.getOrderId()));
    }

你应该这样做:

@CommandHandler
public OrderAggregate(CreateOrderCommand command) {
    apply(new OrderCreatedEvent(command.getOrderId()));
}

希望这对你有帮助@Sunny!

在事件存储中找不到聚合

出现此异常的主要原因是,当轴突试图保存聚集体时,它应该首先创建聚集体。

@CommandHandler
public OrderAggregate(CreateOrderCommand command) {
    apply(new OrderCreatedEvent(command.getOrderId()));
}

你也是这样

私有 OrderRepositoryData orderRepositoryData;

不会被初始化,所以也自动装配了 orderRepositoryData。

@Autowired
private OrderRepositoryData orderRepositoryData;

对于连续的事件你应该使用相同的 OrderId ,否则它也会抛出

handleThrowable(java.lang.Throwable,org.springframework.web.context.request.WebRequest) org.axonframework.modelling.command.AggregateNotFoundException: 在事件存储中找不到聚合 在 org.axonframework.eventsourcing.EventSourcingRepository.doLoadWithLock(EventSourcingRepository.java:122)