Для других читателей позвольте мне поделиться Агрегатом, который вы создали в своем хранилище:
@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
}
}
Есть несколько вещей, которые вы можете полностью удалить из этого Агрегата, а именно:
-
OrderRepositoryData
- Конструктор
OrderAggregate
, который устанавливает OrderRepositoryData
- Сохранение вручную
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!