在事件存储中找不到聚合

Sun*_*nny 2 java axon

我正在尝试使用 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

请求正文:-

{
    "studentName":"Sunny Khan"
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我哪里做错了?任何帮助表示赞赏!

Ste*_*ven 5

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

@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
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以从该聚合中完全删除一些内容,它们是:

  1. OrderRepositoryData
  2. OrderAggregate设置的构造函数OrderRepositoryData
  3. Order@EventSourcingHandler注释函数中手动保存 an

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

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

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

    @CommandHandler
    public *void* handle(CreateOrderCommand command) {
        apply(new OrderCreatedEvent(command.getOrderId()));
    }
Run Code Online (Sandbox Code Playgroud)

你应该这样做:

@CommandHandler
public OrderAggregate(CreateOrderCommand command) {
    apply(new OrderCreatedEvent(command.getOrderId()));
}
Run Code Online (Sandbox Code Playgroud)

希望这对你有帮助@Sunny!