All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- FlowQuery API
Introduces an expression-based querying approach that offers a more expressive and unified API. Issue #140 - Reusable step data imports (
@Import)
Enables reusing and composing common step data sets by importing data definitions from another type. Supports optional kind prefixing (CamelCase or Plain) and merges data listeners from the imported and parent step, reducing duplication and improving maintainability. Issue #145
- Spring integration artifacts are now published in two explicit lines
All Spring Boot integration artifacts are now published under coordinates that carry the supported Spring Boot major version:*-spring3for Spring Boot 3 (e.g.de.lise.fluxflow:springboot-spring3) and*-spring4for Spring Boot 4 (e.g.de.lise.fluxflow:springboot-spring4). The historical, unsuffixed coordinates (e.g.de.lise.fluxflow:springboot) are legacy Boot 3-only releases and will not receive new versions - migrate to the-spring3coordinates when upgrading. Core artifacts remain Spring-agnostic and keep their unsuffixed coordinates. Both lines are released together, and the build now verifies the published coordinates before anything is published. Issue #401, Issue #402, Issue #405 - Spring Boot 4 variants now use Jackson 3
The-spring4variant ofspringboot-webnow consumes Spring Boot 4's auto-configured Jackson 3ObjectMapper(tools.jackson.databind.ObjectMapper) instead of requiring a Jackson 2com.fasterxml.jackson.databind.ObjectMapperbean, which Spring Boot 4 no longer auto-configures. This fixes context startup failures (NoSuchBeanDefinitionException: com.fasterxml.jackson.databind.ObjectMapper) and removes the need for the deprecatedspring-boot-jackson2workaround in consuming applications.tools.jackson.module:jackson-module-kotlinis now a runtime dependency ofspringboot-web-spring4, so request bodies deserialize into Kotlin data classes out of the box. The-spring3variants are unaffected and remain on Jackson 2.
- Legacy Query/Filter API
The legacy query and filter APIs are now deprecated in favor of the new FlowQuery API.
Issue #140
- Optional sort property
Enhanced Sort Functionality to Handle Nullable Properties. The Sort interface now includes a nullableProperty function that allows nullable properties to be used for sorting. Issue #135 - Inclusion of nested/recursive validation constraints
The Jakarta validation now reports validation constraints present on step data property's type, as long as the property is itself annotated with@Valid. Issue #152 - Versioning information for step definitions
Step definitions and steps can now carry versioning information. They can be applied by annotating a step with the new@Versionannotation. - Compatibility checks and restored versions for steps
FluxFlow can now check if the current step definition is still compatible with the version that has been used to originally create a step to be loaded from persistence. If it is incompatible, a restored/historic version of the affected step can be returned. See https://docs.fluxflow.cloud/see/2 for more information. - Allow passing additional information when updating step data
TheStepDataServicenow accepts an additional parameter allowing developers to pass additional context information. - DoesNotContainElement filter The filter 'DoesNotContainElement' has been added, which matches collections not matching a given element.
- Not filter
TheNotfilter has been added, which negates the result of the inner filter. - Job querying feature
Added the ability to query for jobs using theJobService.findAllmethod. This allows developers to retrieve jobs based on various criteria. - ElemMatch filter
TheElemMatchfilter has been added, which matches collections where the inner filter matches any element of the collection. - Job duplication
The
duplicateJobmethod has been added, which duplicates the given job and schedules it for a workflow. - Workflow definition metadata
Similar to steps, jobs, and step data, workflow definitions now support metadata. The metadata is automatically extracted from annotations present on the workflow model class. This metadata can be accessed via theWorkflowDefinition.metadataproperty. Issue #86 and Issue #50 - Scheduled job reconciliation on startup
Added a startupBootstrapActionthat validates all jobs marked asScheduledin persistence and automatically reschedules any that are missing from the active scheduler implementation. Enable withfluxflow.scheduling.reconcileOnStartup=true. - Possibility to intercept job executions
Developers can now register JobExecutionInterceptors allowing them to intercept immediate job executions. This allows for custom setup and teardown actions, which might be necessary as jobs are regularly executed outside a request context. Issue #337
-
Configurable replacement scope for workflow continuations
TheContinuation.workflowfunction now supports areplacementScopeparameter that defines which workflow elements should be replaced. The default value is an empty scope, which means that only the workflow itself is replaced.Previously, the standard behavior of a workflow replacement continuation was to replace the steps and jobs of the workflow. Issue #99
-
Added an optional
versionproperty to MongoDB's StepDocument. There is no need for a migration, as the field is optional/nullable. -
A custom collation can now be specified when ensuring indexes using
MongoBootstrapAction. -
MongoDB documents now use a different data structure to store map entries and their data types. See https://docs.fluxflow.cloud/see/1 for more information.
-
If a FluxFlow job has no explicit cancellation key,
Quartz now uses the workflow and job identifier as the job key.
This enables more efficient lookups for pre-scheduled jobs.
To fall back to lookups based on the job detail map (which requires iterating over all scheduled jobs),
setfluxflow.quartz.legacyLookuptotrue.
- NPE within ParamMatcher.isAssignable
TheNullPointerExceptionthat has been thrown withinParamMatcher.isAssignablewhen passing in a generic type has been fixed. Issue #158 - SOE with AndFilter in InMemoryFilter
Fixed a bug in theInMemoryFilterimplementation where theandfilter was not implemented correctly and caused a stack overflow error with infinite recursion ofandcalls. - NPE with NullablePropertyFilter in InMemoryFilter
Fixed a bug in theInMemoryFilterimplementation where thenullablePropertyfilter was incorrectly casting nullable properties and not properly handling null values, which causedNullPointerExceptions during filtering. - CNFE for singleton lists and sets
Fixed a bug in
assertTypeinSimpleType.ktwhere lists and sets with one element cause aClassNotFoundExceptionbecause they are stored using the internal singleton collection types.
- Removed the unused
Type.toKClass()extension function fromde.lise.fluxflow.reflection.
- Model listeners
A model listener can be used to act upon changes to a workflow's model. Similar to data listeners, model listeners are declared by creating a function within the workflow model and annotating it with@ModelListener. Issue #70 - Job(definition) metadata
Jobs and job definitions now support adding metadata using annotations. - Step data modification policy
A step data modification policy can be used to control the modification behaviour on inactive steps. The policy can be accessed by the step data definition. Issue #90 - Step data metadata
Step data can now also be annotated with metadata. The metadata can be accessed via the step data definition. Issue #50
- Harmonized Spring Boot dependencies.
- The Spring packages are now targeting version 3.2.1.
AnyOfFilter,InMemoryAnyOfFilterandMongoAnyOfFilterhave been renamed to[...]InFilterand deprecated aliases have been added to maintain API compatibility. TheFilterinterface now also exposes aFilter.infunction.- The
Filter.inandFiler.anyOfare now accepting a more generalCollection<TModel>parameter. Additionally, there is an overload that directly accepts the more sensibleSet<TModel>. Issue #101 - Packages depending on or extending Spring Boot functionalities are now consistently prefixed with
springboot-. Issue #38 - The
WorkflowServiceis now a composition of all CRUD-related services. Issue #109- create:
WorkflowStarterService - read:
WorkflowQueryService - update:
WorkflowUpdateService - delete:
WorkflowRemovalService
- create:
Workflow.idhas been renamed toWorkflow.identifier. Theidproperty remains as an alias and is deprecated.AnyOfFilter,InMemoryAnyOfFilterandMongoAnyOfFilterare now deprecated aliases forInFilter,InMemoryInFilterandMongoInFilter.
- Changes to the step and workflow are now persisted before publishing events. Issue #47
- Persisting and publishing of step and workflow updates are now skipped if the element didn't actually change. Can be disabled by setting
fluxflow.change-detection.steporfluxflow.change-detection.workflowtofalse. Issue #49 - Dependency injection now throws an exception if the dependency resolution fails for other reasons than a missing dependency (e.g. duplicate beans). Issue #110
- Steps with custom step kinds can now be activated successfully. Issue #115
- Removed experimental and broken
de.lise.fluxflow:memorycachemodule. Issue #94 - The
WorkflowService.replacefunction has been removed as it leaked internal functionality. Issue #10
- Initial FluxFlow release