【发布时间】:2017-12-30 16:34:39
【问题描述】:
我在从 Spring Boot 应用程序的聚合根发布事件时遇到问题。我基本上想要的是每次更改有关某人的某些信息时发布一个“更新”事件。 代码非常简单:
@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();
}
}
我正在通过经理管理Person 实例:
@Service
@Transactional
class PersistentPersonManager implements PersonManager {
// other methods are omitted
@Override
public Person save(Person person) {
return personRepository.save(person);
}
}
但是当我打电话给经理时(manager.save(person.updateInformation(...)) 事件似乎“失踪”了:
在调用 save() 方法时,所有事件仍然存在,但是当 Spring 调用 getModificationEvents() 时,集合为空。这些事件似乎在两者之间的某个地方消失了(只执行了 Spring 代码)。
因为这是非常基本的,所以我一定是错过了一些重要的东西,但却陷入了困境。
那么我该如何回到正轨呢?
【问题讨论】:
标签: java spring jpa events spring-data