агрегат не найден в хранилище событий - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь добавить данные, используя CQRS framework 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 голосов
/ 14 февраля 2019

агрегат не найден в хранилище событий

Основной причиной этого исключения является то, что когда аксон пытается сохранить агрегат, он должен сначала создать агрегат.

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

Такжетаким образом, ur

private 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)
0 голосов
/ 04 февраля 2019

Для других читателей позвольте мне поделиться Агрегатом, который вы создали в своем хранилище:

@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, который устанавливает OrderRepositoryData
  3. Сохранение вручную Order в аннотированной функции @EventSourcingHandler

То, что вы здесь делаете, - это смешение заботы модели команд о принятии решений с созданием запрашиваемого Order для модели запросов.Было бы лучше полностью удалить эту логику из Aggregate (модель команд в вашем примере) и переместить ее в компонент обработки событий.

Это, однако, не является причиной для 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!

...