在事件存储中找不到聚合

时间:2019-02-03 17:45:01

标签: 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)

但是我的代码(OrderAggregate.Java)中已经有一个汇总。

完整代码位于-https://github.com/iftekharkhan09/OrderManagementSystem

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

请求正文:-

{
    "studentName":"Sunny Khan"
}

有人可以告诉我我在哪里做错了吗? 任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

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

@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. 设置OrderAggregate的{​​{1}}构造函数
  3. OrderRepositoryData带注释的函数中手动保存Order

您在这里所做的是将命令模型的决策考虑与为查询模型创建可查询的@EventSourcingHandler混合在一起。最好从聚合(在示例中为命令模型)中完全删除此逻辑,然后将其移到事件处理组件中。

但这不是您收到的Order的元凶。 您所缺少的是使AggregateNotFoundException命令处理程序成为构造函数。

CreateOrderCommand将创建一个Order,正如其名称所暗示的那样。 因此,应由构造函数而不是常规方法处理。 因此,代替此:

CreateOrderCommand

您应该这样做:

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

希望这可以帮助您@Sunny!

答案 1 :(得分:0)

在事件存储中找不到聚合

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

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

也通过这种方式

私有OrderRepositoryData orderRepositoryData;

不会被初始化,因此也要自动连接orderRepositoryData。

@Autowired
private OrderRepositoryData orderRepositoryData;

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

ae.emaratech.nga.handler.NGAExceptionHandler.handleThrowable(java.lang.Throwable,org.springframework.web.context.request.WebRequest) 
org.axonframework.modelling.command.AggregateNotFoundException: The aggregate was not found in the event store
    at org.axonframework.eventsourcing.EventSourcingRepository.doLoadWithLock(EventSourcingRepository.java:122)