We recently successfully completed migrating our CQRS/Event Sourcing backend from Axon Framework 4.12 to 5.0. The codebase has dozens of aggregates, multiple sagas, and hundreds of event handlers, so it wasn’t trivial.
We wrote up what we learned along the way — the biggest surprises were the scope of API changes (every package moved), replacing sagas with stateful event handlers backed by database persistence, and the underdocumented @EventTag requirement that silently breaks test fixtures.
The full write-up is here: Migrating from Axon Framework 4 to 5: What We Learned — SaaSForge
A few things I’d highlight for anyone planning the same migration:
- Automate the mechanical work (package renames, annotation swaps) with scripts — it’s the bulk of compilation errors but trivially scriptable
- The saga-to-stateful-handler refactoring was the biggest change but also the most valuable
- Watch out for the upcaster gap (not available until 5.2.0)
- @EventTag on every event + @EventSourcedEntity(tagKey) on every aggregate — without this, test fixtures silently fail to replay events
Happy to answer questions if anyone is going through the same process.
And we have to say: the Axon 5 works REALLY well now when the full reactive stack is embraced!