Moving the Flowable REST WAR to a Spring Boot application

Teams that run flowable-rest.war on Tomcat can move to their own Spring Boot application built on the Flowable starters. This page covers what carries over, what changes, and what drives the effort.

On this page

Why teams move the Flowable REST WAR to a Spring Boot application

Teams move the Flowable REST WAR to a Spring Boot application when they want the Flowable REST API inside their own deployable unit, with their own build, configuration, security filters and release cadence, instead of a separate flowable-rest.war deployed beside other applications on Tomcat. The short answer is that the move is usually a moderate, well-bounded effort, not a rewrite. The Flowable REST application is itself a Spring Boot application, so the properties, externalized configuration and bean definitions you already depend on carry over more directly than they would in a generic WAR-to-Spring-Boot move. The old rest.* and engine.* properties map to flowable.* properties managed by the Flowable starter, and the starters flowable-spring-boot-starter-rest and flowable-spring-boot-starter supply the engine and REST wiring you would otherwise assemble yourself. Confirm the exact property mapping against the Flowable applications guide for the version you run, because mappings are version-specific.

Scope depends less on the WAR itself than on what surrounds it. Count the custom beans, servlet filters, listeners and delegates added to the WAR, because each one must be re-registered in your application context and retested. Identity is the next driver: if you replaced the default identity service through IdmIdentityServiceImpl or the IdmIdentityService interface, that code must be reattached and its connection to your directory verified. Database settings and the H2 default, which the WAR uses until configured otherwise, need explicit production values before any data moves. Finally, your deployment practice sets the pace: a team with a tested pipeline for process definitions and configuration will move faster than one that deploys by copying files to Tomcat. Ask any partner to base the quote on a written inventory of these four areas, and to name which Flowable version and Spring Boot baseline the target uses, since the Flowable 8.0.0 line requires Spring Boot 4 and does not support Spring Boot 3.

What maps cleanly from the REST WAR and what needs redesign

This table compares each part of the flowable-rest.war deployment with its counterpart in a Spring Boot application built on Flowable starters. Read the Spring Boot column as the target you must confirm in your own build, not as a finished migration step. The main takeaway is that REST paths, properties and the database layer move with some translation, while container assumptions, default accounts and custom wiring usually need redesign.

AreaIn the REST WARIn your Spring Boot application
REST pathsServed under /flowable-rest with Swagger docs at /flowable-rest/docsPath prefix is set by your application configuration; confirm every path your clients call still resolves
Property namesLegacy rest.* and engine.* keysMap to flowable.* keys managed by the starter; Spring Boot externalized configuration still applies
DatabaseStarts on in-memory H2 unless you configure otherwiseYou must set the datasource explicitly; the supported list includes MySQL, Oracle, PostgreSQL, DB2 and SQL Server
ContainerDeployed as a WAR on a Jakarta Servlet 6 container such as Tomcat 10 or laterRuns as an executable application; the servlet container becomes an embedded choice you must confirm
Starter choiceSingle deployable covering all engines and RESTPick flowable-spring-boot-starter, the REST variant, or a single-engine starter; each changes which beans and endpoints exist
Identity handlingDefault accounts and identity setup shipped with the applicationReplace with your own identity service through IdmIdentityService or an override; review default accounts before go-live
Custom beans and listenersOften attached through WAR-level configuration or classpath scanningRe-register as Spring beans; check bean names and injection points against the new starter wiring
MonitoringApplication-level monitoring as configured in the WARActuator starter exposes /actuator/flowable for running process data; confirm exposure settings in your build

Choosing the right Flowable starter for your application

The Flowable REST application is a Spring Boot application, so replacing the WAR means choosing starters that bring the same engines and endpoints into your own build. The starter you pick decides which engines load and which REST paths exist, so the choice should be made against the calls your clients make today.

All engines without REST

The flowable-spring-boot-starter loads the BPMN, CMMN, DMN and event registry engines in one application without exposing HTTP endpoints. It fits services that call the Java API directly, such as a back-end module that starts processes from application code. Before choosing it, confirm that no existing client depends on the REST paths in your current WAR, because this starter will not serve them.

All engines with REST

The flowable-spring-boot-starter-rest is the closest match to the current WAR because it combines all engines with the REST API. This is usually the first option to test against your existing clients. Inventory every path your clients call, including the /flowable-rest context path, and compare it with the endpoints this starter registers in a test run.

Single engine starters

Process-only, CMMN-only and DMN-only starters load one engine, with or without REST. A decision service that only evaluates DMN tables can run on the DMN starter, which keeps the footprint small. The trade-off is that a client calling a process endpoint against a DMN-only application will fail, so each deployment unit must be mapped to the engines its clients use.

Actuator starter for monitoring

The actuator starter exposes the /actuator/flowable endpoint for monitoring running processes. It is an addition to an engine starter, not a replacement for one, so it does not provide any process or REST API on its own. Confirm with your operations team which health and monitoring checks currently run against the WAR, since those probes must point at the new application.

Matching endpoints before cutover

The starter choice sets which REST endpoints exist, so a path that worked on Tomcat can return a 404 after the move. Build a comparison of current request logs against the endpoints from the new application, and record each gap as either a client change or a starter change. This check should happen before the build is frozen, not during the cutover window.

How the move runs from inventory to decommissioning the WAR

The sequence turns an undocumented flowable-rest.war on Tomcat into a Spring Boot application that serves the same REST contract, with each stage producing evidence that the next stage depends on. Work is ordered so that clients are moved only after the new application has matched the old one against real data.

  1. Inventory REST usage, properties and custom beans

    Your team and DeployOpen list every REST path your clients call, including the Swagger endpoints under /flowable-rest/docs, and record which clients call each one. The team also exports the current rest.* and engine.* properties from the WAR's configuration, identifies custom beans, listeners, delegates and identity service overrides, and notes the database type and version. Done means a written inventory that names each path, property and custom class, with an owner for each client, and a list of anything you cannot yet explain.

  2. Map properties to the Flowable starter

    Each legacy rest.* and engine.* property is mapped to its flowable.* equivalent under the Flowable Spring Boot starter, because the REST application is itself a Spring Boot application with externalized configuration. Properties with no direct equivalent are flagged for a decision rather than silently dropped. Done means a reviewed property map that your security and platform owners have signed off, including where authentication and database settings are defined and how secrets are supplied.

  3. Build the Spring Boot application with the chosen starter

    DeployOpen builds a Spring Boot project around the Flowable starter that matches the scope: all engines with REST, or only the process, CMMN or DMN engines you actually use. Custom beans, delegates and the identity service are ported into the project, and the Flowable version is pinned to a release that fits your Java and Spring baseline. Done means the application starts against an empty schema, the REST paths from the inventory respond, and the build produces a single artifact your pipeline can deploy.

  4. Pilot against a copy of the production database

    The new application is started against a restored copy of the production database so that existing process definitions, active instances, jobs and history are read by the new build. Your DBA confirms the schema and the database version are within the supported list, and the team checks that timers and async jobs are picked up without duplicate execution. Done means a pilot report listing startup results, any schema or job errors, and the fixes applied and retested.

  5. Run both applications in parallel and compare responses

    The WAR and the Spring Boot application are run side by side against the same data, and a set of representative requests is replayed against each. Responses are compared for status codes, payload structure, pagination, error messages and ordering, and any difference is classified as intended or as a defect. Done means a comparison log in which every difference is either fixed or accepted in writing by the client owners.

  6. Cut over clients and data

    Clients are switched to the new base URL or routing rule in agreed groups, and a short write freeze is planned if the database must be copied for a final time. Rollback steps are rehearsed, including how to point clients back to the WAR and how to confirm that no process state was written only to the new database. Done means every client group reports successful calls from the new application, the cutover record lists the final data copy checks, and the rollback has been tested at least once.

  7. Decommission Tomcat and the WAR

    After an agreed observation period, the WAR is removed from Tomcat, the Tomcat instance and its configuration are retired, and the old properties files, certificates and service accounts are removed or documented as retired. Backups of the WAR, its configuration and the final database state are retained according to your retention policy. Done means the inventory is marked closed, the runbook reflects the new deployment, and your operations team has confirmed that the monitoring endpoint and logs for the new application are in place.

Carrying over database settings and authentication

The first thing to settle is the database, because the WAR starts on an in-memory H2 database by default and a Spring Boot application that starts without explicit settings will do the same. Nothing in that setup survives a restart, so the reader must point the application at a supported database (the configuration docs list H2, MySQL, Oracle, PostgreSQL, DB2 and Microsoft SQL Server) and decide deliberately how the schema is created. Confirm which schema creation approach your team will use, who owns the DDL in each environment, and whether production schemas are created by a pipeline or by the engine at startup. If the target is MySQL, check the version against the precision note in the configuration docs, since versions below 5.6.4 lack millisecond precision, which affects timer and history timestamps. Record the datasource properties you carry over as flowable.* and Spring datasource keys, not as legacy engine.* keys.

Authentication is the second place where the WAR's defaults will not carry over unchanged. Identity management is replaceable: the Flowable docs say you can override IdmIdentityServiceImpl or implement the IdmIdentityService interface, and an LDAP identity service is provided as a reference. Before writing any code, document how users, groups and their privileges are resolved in your current deployment, including which directory is authoritative, how group names map to Flowable groups, and which accounts exist by default. Those accounts must be removed or replaced in the new application. Your team should also confirm how the REST endpoints are protected, because the Spring Boot application will need its own security configuration rather than the WAR's container setup.

Test identity and database behavior against a copy of production-like data before cutover. Ask a sample of users, including one from each group that starts or completes tasks, to call the same REST paths and compare results with the existing WAR. Verify that a timer or async job created on one node is picked up after a lock expires when two instances run, since the async executor relies on lock owners and expiration times stored in the database. Deciding these items early is cheaper than discovering them after the first production migration of running instances.

What drives the effort and duration of the move

This table lists the factors that most change how long the move takes and what it costs, with the direction each one pushes effort. Use it to see which answers from your own environment will shape a quote, and to check whether a proposal accounts for them. The main takeaway is that custom code, identity scope and client path dependencies usually outweigh the WAR swap itself.

DriverEffect on effortWhat to ask for in a quote
Custom beans and delegates in the WAR's classpathRaises effort: each bean or delegate must be ported to the starter's configuration model and retestedA count of custom beans, listeners and delegates, and a porting estimate per item
Identity replacement scopeRaises effort when the WAR uses a custom or LDAP identity service that must be reimplemented or verified against the Spring Boot security setupWhich identity service is in use today, whether it changes, and the test cases for users, groups and permissions
Database change during the moveRaises effort when the schema, driver or vendor changes at the same time as the application, since the two changes must be separated and verifiedWhether the database stays the same, and a plan for schema creation and data validation if it does not
REST clients depending on exact pathsRaises effort in proportion to the number of clients that call fixed URLs, since each path, property and response shape must be preserved or versionedAn inventory of client applications, the endpoints each uses, and the compatibility tests planned for them
Properties and externalized configurationLowers effort when properties are few and map cleanly to flowable.* keys, raises it when environment-specific settings are spread across files and scriptsA mapping table from old rest.* and engine.* keys to new keys, and where each secret is stored
Deployment pipeline maturityLowers effort when builds, container images and environment promotion are already automated; raises it when the WAR is deployed by hand to TomcatWhether the proposal includes pipeline changes, how process definitions are deployed, and rollback steps
Parallel run lengthRaises effort and duration because both the WAR and the new application must stay in sync and be comparedThe length of the parallel run, the comparison method, and who signs off on cutover
Running process instances at cutoverRaises effort when many instances or timers are in flight and must continue on the new application without lossHow in-flight jobs and timers are handled and whether the quote covers a rehearsal of the switch

What usually goes wrong and how to prevent it

Moving from a WAR on Tomcat to a Spring Boot application changes more than the packaging. The REST surface, defaults, database, job execution and dependency baseline can all shift without an obvious error. The cards below cover the risks we see most often and the checks that catch them before cutover.

Silently different REST paths

The WAR serves REST under its own context path, with Swagger at /flowable-rest/docs. A Spring Boot application uses its own server context path and servlet mapping, so existing clients can receive 404 responses or hit a different path with no error in the engine logs. Inventory every client call, then compare the paths the new application exposes against that list in a staging environment before any traffic moves. Confirm the context path and documentation location with the Flowable applications guide and your own configuration.

H2 left in production

The REST application starts with an in-memory H2 database by default. A new Spring Boot project may also inherit an embedded database when no datasource is set, so the application can start cleanly while writing process state to memory that disappears on restart. Set the datasource explicitly, add a startup check that fails when the URL points at H2, and confirm that running instances appear in the target database before cutover.

Async jobs picked up by new nodes

The async executor stores lock owners and lock expiration times in the database, so jobs and timers are recovered when a node's lock expires and another node takes them. Running the old WAR and the new application against the same database during a rolling cutover can cause duplicate or stalled timers. Plan a single writer window, drain the old node's executor, and check that lock expiration settings match your deployment model before scaling out.

Spring and Jackson version drift

Starters for newer Flowable releases move the baseline. Flowable 8.0.0 requires Spring Framework 7 and Spring Boot 4 and does not support Spring Boot 3, and it uses Jackson 3 by default with a Jackson 2 compatibility layer. Custom beans, delegates and serializers built against older libraries can fail at startup or change date and JSON output. Pin the versions you test, run serialization tests against recorded REST responses, and review the release notes before choosing a starter.

Forgotten properties

Old rest.* and engine.* properties map to flowable.* keys managed by the starter, but any property missed in the mapping is ignored without warning. Settings such as history level, async executor options, security or database pool sizes can revert to defaults silently. Build a property inventory from the old WAR's configuration, translate each entry, and write a check that compares the effective configuration of both deployments at startup.

Questions buyers ask before moving the REST WAR

How much effort does moving the REST WAR to Spring Boot take?

The effort depends mostly on how much the current WAR has been changed from stock. A stock flowable-rest.war with default H2 storage and no custom beans is the smallest case. Effort grows with the number of custom Java classes, delegates and listeners packaged alongside the WAR, the number of rest.* and engine.* properties in use, the authentication setup in front of the API, and the database and deployment pipeline you already run. The Flowable applications guide notes that old rest.* and engine.* properties map to flowable.* properties, so the property mapping itself is usually a small part of the work. Ask any partner to inventory these items against your current WAR before quoting.

How long does the migration take?

No duration is fixed by the supplied facts, so treat any number you hear as a claim to verify. Duration follows from the inventory above, the number of environments that need the new application, the depth of testing against your process definitions and REST clients, and how many change windows your organization allows for cutover. Ask for a written plan with phases, entry and exit criteria for each phase, and the dates your team must supply reviewers, test data and access.

What does the migration need from our team?

Expect to supply several roles: an owner who knows which client applications call the REST API, someone who can export the current configuration and custom code, a database administrator for schema and credentials, and a platform engineer for the build and deployment pipeline. Your team also needs to name the authentication source the API uses today and confirm who approves changes to process definitions in each environment. Agree these responsibilities in the written scope so testing and cutover do not wait on informal access.

Can an internal team move the REST WAR without a partner?

Often yes, if the team already builds Spring Boot services, has Flowable experience and can run the existing REST API tests against the new application. The work is manageable for a stock WAR with few customizations and is harder when custom beans, identity overrides or unusual database settings are involved. Compare your team's time against the inventory, the testing you need and the risk of a failed cutover. A fixed-scope engagement lets you buy specific pieces, such as the property mapping, the authentication design or the pipeline, while your team keeps the rest.

Should we use Spring Boot 4 or Spring Boot 3 as the baseline?

Choose based on the Flowable version you target. The Flowable 8.0.0 release notes describe an upgrade to Spring Framework 7 and Spring Boot 4 with no backward compatibility for Spring Boot 3, and Flowable 8.0.0 was released on February 27, 2026. Flowable 7.0.0 moved to Spring Boot 3, Java 17 and Jakarta EE. If you move to Flowable 8, plan for Spring Boot 4, Jackson 3 as the default JSON library and removal of JUnit 3 and 4 support in your tests. If your application must stay on Spring Boot 3, confirm which Flowable line supports it before you start.

What happens to the WAR during a parallel run?

A common approach is to run the new Spring Boot application beside the existing WAR, point a subset of test clients at it and compare responses for the same process definitions and instances. The WAR stays deployed and serves production traffic until the cutover decision. Plan for both applications to avoid writing to the same database schema at the same time unless the design explicitly supports it. Also plan for the async executor: the Flowable advanced docs describe lock owners and lock expiration stored in the database, so confirm how jobs and timers behave while two nodes can see the same data. Confirm the rollback path before the parallel run starts.

Choosing a Spring Boot baseline for the new application

The first decision is which Spring Boot line the new application will sit on, because that choice follows from the Flowable version you run. Flowable 8.0.0 moved to Spring Framework 7 and Spring Boot 4 with no backward compatibility for Spring Boot 3. Flowable 7 was built on Spring Boot 3, so a team that stays on Flowable 7 should keep its application on Spring Boot 3, while a team that moves to Flowable 8 must plan for Spring Boot 4 from the start. Mixing the two is not a supported path, so confirm the exact Flowable version your WAR runs today, including the version of any embedded engine jars, before you pick the parent POM. Check the release notes for the version you are moving to at Flowable 8.0.0 release notes.

Two library changes in the 8.0.0 line affect custom code more than configuration. Jackson 3 is now the default JSON library, with a Jackson 2 compatibility layer available. Any custom delegate, listener, REST extension or bean that imports Jackson 2 types, or that serializes variables with Jackson 2 annotations, needs an explicit review. Test framework support also changed: JUnit 3 and 4 support was removed, so any existing Flowable test suite that depends on them must be migrated before the build can pass. Ask your development team to list every custom class that touches JSON or tests, and to state which of these two areas it depends on. That list is the input to the effort estimate for the baseline decision.

How DeployOpen scopes and delivers the move

DeployOpen plans the move of your flowable-rest.war deployment to a Spring Boot application you own, starting from a written inventory of your REST paths, properties, authentication and custom beans. We then build, test and document the new application inside your own infrastructure and hand it over with the runbooks your team needs to operate it.

How we scope

  • Inventory every REST path, property and client your current flowable-rest.war serves before work starts
  • Confirm which Flowable starter fits your needs, such as the all-engines REST starter or a single-engine starter
  • Record the database, authentication, custom beans and deployment pipeline that the new application must keep
  • Agree the scope in writing as a fixed-scope engagement with deliverables and timelines named in advance
  • Confirm with your team whether ongoing support, upgrades or testing should follow as a retainer

How we build

  • Recreate the REST application as a Spring Boot project, mapping legacy rest.* and engine.* properties to flowable.* settings
  • Carry custom beans and identity services across, and test each one against the new starter configuration
  • Set up authentication and database connections in your environment, then run regression tests against the REST endpoints
  • Wire the build into your existing deployment pipeline so the new application ships the same way your other services do
  • Confirm the Swagger documentation, actuator endpoints and logging behave as your operators expect before cutover

How we hand over

  • Deliver the source, configuration and pipeline definitions in repositories you control
  • Provide a written runbook covering startup, configuration keys, database settings and rollback to the WAR
  • Document the test results, the endpoint compatibility checks and any known differences from the original deployment
  • Walk your platform and engineering teams through operation, monitoring and troubleshooting before handover closes
  • Record open decisions so your team can confirm them with the vendor or in your own environment

How we support

  • Offer ongoing support, upgrades and continuous testing as a retainer after the handover
  • Plan upgrades of the Flowable version and Spring Boot baseline as separate, scoped work
  • Review configuration and dependency changes for each Flowable release before your team adopts them
  • Keep the support scope in writing so response expectations and included work are clear to both sides
  • Ask for a quote built from the written scope, since DeployOpen does not publish a price list

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.