스프링 부트 응용 프로그램의 aggregate-root에서 이벤트를 게시하는 데 문제가 있습니다. 내가 기본적으로 원하는 것은 사람에 관한 정보가 변경 될 때마다 "Update"이벤트를 게시하는 것입니다. 이 코드는 매우 간단합니다 : 나는 관리자를 통해 Person
인스턴스를 관리하고스프링 데이터 도메인 이벤트가 누락 됨 (?)
@Entity
public class Person {
@Transient
private final Collection<AbstractPersonRelatedEvent> events = new ArrayList<>();
Person(Person other) {
// copy other fields
other.events.foreach(events::add);
}
// other stuff
public Person updateInformation(...) {
Person updated = new Person(this);
// setting new data on the updated person
if (!hasUpdateEventRegistered()) {
updated.registerEvent(PersonDataUpdatedEvent.forPerson(updated));
}
return updated;
}
void registerEvent(AbstractPersonRelatedEvent event) {
events.add(event);
}
@DomainEvents
Collection<AbstractPersonRelatedEvent> getModificationEvents() {
return Collections.unmodifiableCollection(events);
}
@AfterDomainEventPublication
void clearEvents() {
events.clear();
}
}
: 나는 매니저 (manager.save(person.updateInformation(...))
를 호출 할 때
@Service
@Transactional
class PersistentPersonManager implements PersonManager {
// other methods are omitted
@Override
public Person save(Person person) {
return personRepository.save(person);
}
}
그러나 이벤트가 "실종"가서하는 것 : save()
메서드를 호출 할 때 모든 이벤트가 여전히 존재하지만 Spring이 getModificationEvents()
을 호출 할 때 콜렉션은 비어 있습니다. 이벤트는 중간에 사라진 것처럼 보입니다 (스프링 코드 만 실행 됨).
이것은 매우 기본적인 것이므로 필수적인 것을 놓치고 있어야하지만 틀에 박히게됩니다.
그래서 어떻게 다시 돌아올 수 있습니까?