Sunny
Sunny

Reputation: 928

aggregate not found in the event store

I am trying to add data using CQRS framework AXON. But while hitting the API(used to add an order). I am getting the below error:-

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

But i already have an Aggregate in my code(OrderAggregate.Java).

The Full code can be found at - https://github.com/iftekharkhan09/OrderManagementSystem

API to add Order - http://localhost:8080/confirmOrder

Request Body:-

{
    "studentName":"Sunny Khan"
}

Can anyone please tell me where am i doing wrong? Any help is appreciated!

Upvotes: 3

Views: 7716

Answers (2)

shuaib
shuaib

Reputation: 71

aggregate not found in the event store

The main reason for this exception is, When the axon is trying to save the aggregate it should create the aggragate first.

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

Also in this way ur

private OrderRepositoryData orderRepositoryData;

won't be initialized, so autowired the orderRepositoryData also.

@Autowired
private OrderRepositoryData orderRepositoryData;

For the successive events you should use same OrderId ,else also it will throw

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)

Upvotes: 1

Steven
Steven

Reputation: 7275

For other readers, let me share the Aggregate you've created in your repository:

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

}

There are several things you can remove entirely from this Aggregate, which are:

  1. The OrderRepositoryData
  2. The OrderAggregate constructor which sets the OrderRepositoryData
  3. The manually saving of an Order in the @EventSourcingHandler annotated function

What you're doing here is mixing the Command Model's concern of making decisions with creating a queryable Order for the Query Model. It would be better to remove this logic entirely from an Aggregate (the Command Model in your example) and move this to an Event Handling Component.

This is however not the culprit for the AggregateNotFoundException you're receiving. What you've missed is to make the CreateOrderCommand command handler a constructor.

The CreateOrderCommand will create an Order, as it's name already suggests. Hence, it should be handled by a constructor rather than a regular method. So, instead of this:

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

You should be doing this:

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

Hope this helps you out @Sunny!

Upvotes: 6

Related Questions