Я пытаюсь реализовать публикацию событий домена от сущности, следуя примерам, упомянутым в посте ниже:
Пример для @DomainEvents и @ AfterDomainEventsPublication
Однако мне не удалось заставить Spring вызывать мой метод с аннотацией @ TransactionalEventListener.
См. Ниже сущность, сервис, прослушиватель событий и тестовый код:
@Entity
public class Book extends AbstractAggregateRoot<Book>
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true)
private String isbn;
@Column
private String name;
public Book(String isbn, String name)
{
this.isbn = isbn;
this.name = name;
}
public void purchase()
{
registerEvent(new BookPurchasedEvent(id));
}
// getters omitted for brevity
}
Сервис:
@Service
@Transactional
public class BookService
{
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository)
{
this.bookRepository = bookRepository;
}
public void purchaseBook(Integer bookId)
{
Book book = bookRepository.findById(bookId)
.orElseThrow(NoSuchElementException::new);
book.purchase();
bookRepository.save(book);
}
}
Слушатель:
@Service
public class EventListener
{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@TransactionalEventListener
public void handleEvent(BookPurchasedEvent event)
{
logger.info("Received event {}", event);
}
}
Тест:
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class BookEventsTest
{
@Autowired
private BookService bookService;
@Autowired
private EntityManager entityManager;
@Test
public void test()
{
Book book = new Book("abcd-efgh", "El Quijote");
book = entityManager.merge(book);
bookService.purchaseBook(book.getId());
}
}
Сообщение журнала от слушателя не регистрируется.Хотя он работает как REST-сервис и вызывается, например, через Postman