Flowable 8.0.0 Release
- Upgrade to Spring Framework 7 and Spring Boot 4 - Flowable 8 is now based on Spring Framework 7 and Spring Boot 4. There is no support for Spring Boot 3 anymore.
- Upgrade to Jackson 3 - Jackson 3 is now the default JSON library. Jackson 2 is still supported via a compatibility layer
- Remove JUnit 3 and JUnit 4 support - JUnit 3 and JUnit 4 testing support, deprecated in 7.2.0, has been removed. Use JUnit 5 (Jupiter) exclusively
- Lambda Expression support in expressions - Lambda expressions are now supported in expressions. The
planItemInstanceskeyword has been expanded to support filtering based on a predicate using lambda expressions - The method
stream()can be used to obtain ajava.util.stream.Streamfrom a collection. e.g.${customers.stream().filter(customer -> customer.type eq 'premium').toList()}to get a list of premium customers or${customers.stream().map(customer -> customer.name).toList()to get the names of all the customers. - The
planItemInstancesnow expose afilter(Predicate<DelegatePlanItemInstance> predicate)method that can be used to provide custom filter options. - Date variables with milliseconds - Date variables will now include the milliseconds when they are returned over REST. E.g., up to now a date variable with the value of
2020-05-04T09:25:45.583Zwould have been returned as2020-05-04T09:25:45Z. However, now it would be returned as2020-05-04T09:25:45.583Zwhich is still ISO 8601 compliant. - Date properties in UTC - Date properties e.g., Process Instance start time will be returned as an ISO 8601 in the UTC timezone. E.g., if the start time was returned as
2025-09-24T09:58:12.609+02:00now it is returned as2025-09-24T07:58:12.609Z. - Access definition information in expressions during deployment - Expressions can now access some of the definition information in expressions resolved during deployment. e.g. in Start Timer expression
${variableContainer.definitionKey}to access the definition key - Case and Process instance migration improvements:
- Support for updating more task properties when doing case and process instance migration
- Case and process instance migration validation is now available in the REST API
- Option to automatically create plan item instances for new plan items during case instance migration
- End user tracking - Added
endUserIdfor historic process/case instances andstatefor historic process instances - Case and Process end interceptor - Added case and process end interceptor support
- Business status events - Dispatch events when updating the business status of a case or process
- Event Registry hookpoints - Added hookpoints to event registry for event payload types
- Possibility to disable DMN history persistence - Added option to disable history persistence when executing DMN decisions
- Support Java Records in Expressions
- Improve Expression coercion performance
- Long String variables now store a cached value, avoiding repeated deserialization
- Reduce unnecessary
ObjectMapperinstance creation - reuse the one from engine configuration
- Fix issue with multiple case reactivations with a parent case instance
- Fix NPE when having two sentries, and one doesn't have an
ifPart - Fix case / process instance ended invoked twice when undeploying deeply nested app
- Fix issue with moving parallel multi-instance activities to a single activity
- Ensure that multiple character events for the same element are handled correctly in XML parsing
- Make sure that
BeanELResolverand DMN Expression resolution propagates the exception cause - Avoid 'Invalid reference in diagram interchange definition' warning message in logs when plan items are part of a plan fragment
- Unlock exclusive jobs when unacquiring all jobs of a worker
- Unacquiring external worker job should unlock the exclusive scope if the external worker job is exclusive
- Address security concerns raised via GitHub issue
Important: If you have scripts or expressions that call methods on a JsonNode, you need to carefully check if these work with Jackson 3, as many method signatures have changed (see details below). If you are unsure, we recommend starting with Jackson 2 configured first (flowable.variable-json-mapper=jackson2), and then testing for an upgrade to Jackson 3 over time. We do recommend looking into upgrading to Jackson 3, since Jackson 2 will eventually stop receiving updates. See Jackson Releases for the latest support information.
Jackson 3 is used for Flowable internal json manipulation. There is still support for Jackson 2 variables. With Spring Boot this can be enabled by setting flowable.variable-json-mapper to jackson2. By default, Jackson 3 is being used for variables. When configuring Flowable without Spring Boot then the variableJsonMapper on the process, cmmn, and app engine configurations should be set to be org.flowable.common.engine.impl.json.jackson2.Jackson2VariableJsonMapper and the org.flowable.common.rest.variable.Jackson2JsonObjectRestVariableConverter should be added to the appropriate rest response factories.
Notable changes when using JSON in expressions / scripts:
- Packages have changed from
com.fasterxml.jackson.databindandcom.fasterxml.jackson.coretotools.jackson.databindandtools.jackson.core elements()no longer returnsIterator<JsonNode>and instead returnsCollection<JsonNode>values()no longer returnsIterator<JsonNode>and instead returnsCollection<JsonNode>Iterator<String> fieldNames()replaced byCollection<String> propertyNames()Iterator<Map.Entry<String, JsonNode>> fields()replaced bySet<Map.Entry<String, JsonNode>> properties()JsonNode with(String)replaced byObjectNode withObject(String), and if not using a pointer then it is better to useObjectNode withProperty(String)TextNode textNode(String)replaced byStringNode stringNode(String)List<String> findValuesAsText(String)replaced byList<String> findValuesAsString(String)List<String> findValuesAsText(String, List<String>)replaced byList<String> findValuesAsString(String, List<String>)boolean isContainerNode()replaced byboolean isContainer()boolean isEmpty(SerializerProvider)replaced byboolean isEmpty(SerializationContext)JsonNode put(String, JsonNode)replaced byJsonNode replace(String, JsonNode)JsonNode putAll(Map<String, ? extends JsonNode>)replaced byJsonNode setAll(Map<String, ? extends JsonNode>)JsonNode putAll(ObjectNode)replaced byJsonNode setAll(ObjectNode)JsonParser traverse()removed without replacementJsonParser traverse(ObjectCodec)replaced byJsonParser traverse(ObjectReadContext)void serialize(JsonGenerator, SerializerProvider)replaced byvoid serialize(JsonGenerator, SerializationContext)void serializeWithType(JsonGenerator, SerializerProvider, TypeSerializer)replaced byvoid serializeWithType(JsonGenerator, SerializationContext, TypeSerializer)
Methods deprecated in Jackson 3:
String asText()replaced byString asString()String asText(String)replaced byString asString(String)boolean isTextual()replaced byboolean isString()String textValue()replaced byString stringValue()
There is also a behaviour change in the different xxxValue and asXXX methods. In Jackson 3 those methods would fail if the node is not of the appropriate type and / or if it cannot coerce the value to the requested type. e.g.
- When using
stringValueon a nonStringNodeorNullNodeit would fail, in Jackson 2 it would returnnull. - When using
asStringon aObjectNodeorArrayNodeit would fail, in Jackson 2 it would return an empty string.
- Upgrade to Spring Framework 7 / Spring Boot 4
- Upgrade to Jackson 3 (with Jackson 2 compatibility)
- Various other dependency updates
Nightly
- 8dd092c: [dotnet][rb][java][js][py] Automated Browser Version Update (#17140) (Selenium CI Bot) #17140
- aa3168d: [java] Catch exception on .contentAsString with binary content (#17139) (tim-burke-systemware) #17139
- 2f71272: [dotnet] [bidi] Wait until events are dispatched when unsubscribing (#17142) (Nikolay Borisenko) #17142
- e23507e: [dotnet] Any WebDriver can be disposed asynchronously (#17119) (Nikolay Borisenko) #17119