flowable/flowable-engine · warning
Using Joda-Time LocalDate has been deprecated and will be…
Error message
Using Joda-Time LocalDate has been deprecated and will be removed in a future version. Variable {} in {} instance {} and sub-scope {} was a Joda-Time LocalDate. What it means
A deprecation warning logged by JodaDateType.setValue when a variable in a non-task, non-process scope (e.g. case or other scope types) holds a Joda-Time LocalDate. Scope type, id and sub-scope id are logged; the value is stored as start-of-day millis.
Solutions
- Switch the value type to java.time.LocalDate
- Refactor value-producing code to the java.time API
- Track and remove remaining Joda-Time variable usage before upgrading Flowable
Example fix
// before runtimeService.setVariable(scopeId, "window", org.joda.time.LocalDate.now()); // after runtimeService.setVariable(scopeId, "window", java.time.LocalDate.now());
Defensive patterns
Strategy: validation
Validate before calling
if (value instanceof org.joda.time.LocalDate) { value = ((org.joda.time.LocalDate) value).toDateTimeAtStartOfDay().toGregorianCalendar().toZonedDateTime().toLocalDate(); } Type guard
boolean isJodaLocalDate(Object v) { return v instanceof org.joda.time.LocalDate; } Prevention
- Convert Joda to java.time before setting scoped variables
- Log/monitor deprecation warnings to find remaining Joda usages
- Pin a migration milestone before Flowable's Joda removal release
When it happens
Trigger: Setting a variable to org.joda.time.LocalDate when ValueFields has neither taskId nor processInstanceId, only scopeType/scopeId/subScopeId (e.g. scoped variable storage).
Common situations: Applications using sub-scope variable storage with legacy Joda date values; upgraded Activiti 5 code.
Understand the failure class
Background: "is deprecated and will be removed" — deprecation warnings for old API names, keywords, and options, and how to migrate before the removal release — this error's family across 29 libraries.
Related errors
- Using Joda-Time DateTime has been deprecated and will be…
- Using Joda-Time DateTime has been deprecated and will be…
- Using Joda-Time DateTime has been deprecated and will be…
- Using Joda-Time LocalDate has been deprecated and will be…
- Using Joda-Time LocalDate has been deprecated and will be…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/76ac25b38a08f8f3.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-variable-service/src/main/java/org/flowable/variable/service/impl/types/JodaDateType.java:66
if (longValue != null) {
return new LocalDate(longValue);
}
return null;
}
@Override
public void setValue(Object value, ValueFields valueFields) {
if (value != null) {
if (valueFields.getTaskId() != null) {
JodaDeprecationLogger.LOGGER.warn(
"Using Joda-Time LocalDate has been deprecated and will be removed in a future version. Task Variable {} in task {} was a Joda-Time LocalDate. ",
valueFields.getName(), valueFields.getTaskId());
} else if (valueFields.getProcessInstanceId() != null) {
JodaDeprecationLogger.LOGGER.warn(
"Using Joda-Time LocalDate has been deprecated and will be removed in a future version. Process Variable {} in process instance {} and execution {} was a Joda-Time LocalDate. ",
valueFields.getName(), valueFields.getProcessInstanceId(), valueFields.getExecutionId());
} else {
JodaDeprecationLogger.LOGGER.warn(
"Using Joda-Time LocalDate has been deprecated and will be removed in a future version. Variable {} in {} instance {} and sub-scope {} was a Joda-Time LocalDate. ",
valueFields.getName(), valueFields.getScopeType(), valueFields.getScopeId(), valueFields.getSubScopeId());
}
valueFields.setLongValue(((LocalDate) value).toDateTimeAtStartOfDay().getMillis());
} else {
valueFields.setLongValue(null);
}
}
}
View on GitHub (pinned to d6d39ce1c6)