Java EE to Spring Boot
Java EE to Spring Boot: a construct-by-construct mapping.
Most Java EE code has a direct Spring counterpart. The bugs come from behavior the container supplied without being asked.
The short answer
Migrating Java EE to Spring Boot means replacing each container-provided service with its Spring counterpart: EJBs with Spring beans, CDI with Spring dependency injection, JPA with Spring Data JPA, JAX-RS with Spring MVC and JMS with Spring messaging. Annotations are easy to swap. Transaction, scope and error-handling behavior is where engineers must review.
Overview
What replaces each Java EE technology in Spring Boot?
| Java EE | Spring Boot | Effort |
|---|---|---|
| EJB (@Stateless, @Singleton) | @Service, @Component | Moderate. Behavior review needed |
| EJB (@Stateful) | Session-scoped bean or redesign | High |
| Message-driven bean | @JmsListener, @RabbitListener, @KafkaListener | Moderate |
| CDI (@Inject, @Named, scopes) | @Autowired or constructor injection, Spring scopes | Low |
| JPA (@Entity, EntityManager) | Spring Data JPA, same entities | Low |
| JAX-RS (@Path, @GET) | Spring MVC (@RestController, @GetMapping) | Moderate |
| JAX-WS (SOAP) | Spring Web Services or CXF | Moderate |
| JTA (@TransactionAttribute) | @Transactional | Moderate. Defaults differ |
| Bean Validation | Same API, Spring integration | Low |
| JSF | Redesign to MVC with a template engine or a JavaScript front end | High |
EJB
How do EJBs convert?
A stateless session bean becomes a Spring bean. The class annotation changes and so does injection: @EJB or @Inject becomes constructor injection. Singleton EJBs map to Spring's default singleton scope, but note that @Singleton in EJB serializes access with a container lock by default and a Spring singleton does not. If the code relied on that lock for thread safety, add explicit synchronization.
Stateful beans are harder. They hold client state in the server, so the choice is between a session-scoped bean, which keeps state in the HTTP session, or externalizing the state to a store or the client. Review each one by hand.
Transactions
What changes about transactions?
EJB methods run in a transaction by default. Spring methods do not, unless annotated @Transactional, or the class carries it. A migrated service that loses its transactional boundary will still compile and run. It will just stop being atomic.
Also check propagation values such as REQUIRES_NEW and MANDATORY, which exist in both but sit on different annotations. For transactions that span several resources (XA), Spring needs a JTA provider such as Narayana or Atomikos, or the design must change to avoid them.
Persistence and injection
What about JPA and CDI?
JPA entities usually carry over unchanged. Spring Data JPA adds repository interfaces, which can replace hand-written DAOs, but adopting them is optional. The common surprise is persistence context scope: in Java EE, a container-managed EntityManager is tied to the transaction, and lazy loading behaves according to that. Spring Boot, with Open Session in View on by default for web requests, can mask lazy loading problems in development that fail in a batch job. Turn that setting off deliberately and test.
CDI maps to Spring injection with few surprises. Producer methods become @Bean methods, qualifiers become @Qualifier, and @RequestScoped and @SessionScoped have Spring equivalents. CDI events and interceptors need a manual rewrite to Spring events and aspects.
Web and messaging
How do JAX-RS and JMS move?
JAX-RS can stay: Spring Boot can run Jersey. That is a legitimate way to keep the change small. If you convert to Spring MVC, exception mappers become @ControllerAdvice handlers, filters become Spring interceptors or servlet filters, and content negotiation settings need checking against the old behavior.
JMS in Spring Boot needs a broker, because the application server no longer provides one. Pick a broker, then map queues, acknowledgements and redelivery. The details, with WebLogic specifics, are on WebLogic to Spring Boot.
Namespace
What about javax and jakarta?
Spring Boot 3 requires Java 17 and the jakarta namespace, so any javax import you carry over must change. Do the Java upgrade first if you are on 8 or 11. For the namespace work, see javax to jakarta migration, and for the framework side, Spring Boot 3 migration.
Tools and review
How much of this is automated?
Annotation swaps, import changes and dependency updates are mechanical, and tools such as OpenRewrite handle many of them. The mapping above is where tools stop and review begins: transaction defaults, scopes, locks, lazy loading and error handling. Every diff is read by an engineer, and characterization tests run before and after.
A mapping table with before and after code pairs from our sample repo is not published yet. Until it is, the table above is the pattern. We state no effort figures.
Where next
Which server are you leaving?
The server matters because each has its own vendor descriptors and APIs. See WebLogic migration, WebSphere migration or JBoss EAP migration, and the hub at Java modernization.
Map each container service to its Spring counterpart, starting with an inventory. Session EJBs become Spring beans, CDI becomes Spring injection, JMS moves to Spring messaging, and transactions use @Transactional. Test behavior before and after.
Stateless and singleton EJBs become Spring beans such as @Service classes. Stateful EJBs need a redesign. Message-driven beans become listener methods.
Usually not. Entities carry over, and Spring Data JPA is optional. Check persistence context scope and lazy loading behavior.
Yes. Spring Boot can run Jersey, which keeps resource classes unchanged. Convert to Spring MVC only if you want one model.
Behavior the container supplied implicitly, especially default transactions. Code compiles and runs but stops being atomic. Characterization tests catch it.
For a new target, yes. It needs Java 17 and the jakarta namespace.
Know the cost before anything moves.
A fixed-price assessment gives you the inventory, the risk score and a phased plan. Scope and cost are fixed before the migration starts.
Book a Fixed-Price AssessmentGet in touch
Talk to a modernization engineer
Tell us what you run today. An engineer, not a sales script, replies within one business day.