Явное сохранение требуется для обработки событий AbstractAggregate Root в Spring - PullRequest
0 голосов
/ 03 марта 2020

Я пытался go просмотреть документацию Spring, но не могу найти подтверждение. Я предполагаю, что при расширении AbstractAggregate Root (spring-data-commons-2.2.4.RELEASE) (и регистрации новых событий в определенных методах) я должен явно вызывать save-метод в соответствующем классе репозитория, чтобы обработчики событий могли принять место. Это правда? Это кажется странным, так как явное сохранение (для загруженного агрегата root в транзакционном контексте) является антипаттерном для моего понимания

Есть ли способ "запустить" прослушиватели событий для событий, зарегистрированных через AbstractAggregate Root .registerEvent ?

Это упрощенный код

@Entity
public class AggregateRoot extends AbstractAggregateRoot<AggregateRoot> {
        @Id
        private long id;
        public void executeAction(){
                if(myState.isSomething()){
                        registerEvent(new FancyEventHappened(this.id));
                }
        }
}

public interface AggregateRootRepository extends JpaRepository<AggregateRoot, Long>{}

@Service
public class MyService{
        final AggregateRootRepository aggregateRootRepository;
        @Transactional
        public void execute(int id){
                AggregateRoot aggregateRoot = aggregateRootRepository.findById(id).get();
                aggregateRoot.executeAction();
                //is this required? Any way around it if it is?
                //aggregateRootRepository.save(aggregateRoot);
        }
}

public class FancyEventHappened extends ApplicationEvent{
        public FancyEventHappened(Object source) {
                super(source);
        }
}

public class FancyEventListener{
        @TransactionalEventListener(TransactionPhase = TransactionPhase.BEFORE_COMMIT)
        public void somethingFancyHappened(FancyEventHappened event){
                System.out.println("Hooray "+event.getSource());
        }
}

Спасибо за любые ответы!

...