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. Process Variable {} in process instance {} and execution {} was a Joda-Time LocalDate. What it means
A deprecation warning logged by JodaDateType.setValue when a process-instance variable holds a Joda-Time LocalDate. Flowable logs the variable name, process instance id and execution id, stores the value as millis, and continues.
Solutions
- Use java.time.LocalDate instead of org.joda.time.LocalDate
- Update Java delegates/listeners producing the Joda value
- Migrate existing variable data with a one-off script if needed before the removal release
Example fix
// before
delegateExecution.setVariable("planDate", org.joda.time.LocalDate.now());
// after
delegateExecution.setVariable("planDate", java.time.LocalDate.now()); Defensive patterns
Strategy: validation
Validate before calling
if (vars.values().stream().anyMatch(v -> v instanceof org.joda.time.LocalDate)) { throw new IllegalArgumentException("Joda LocalDate variables are deprecated"); } Type guard
boolean isJodaLocalDate(Object v) { return v instanceof org.joda.time.LocalDate; } Prevention
- Migrate delegates/listeners to java.time
- Add integration tests asserting variable types
- Grep the codebase for org.joda.time.LocalDate usages feeding setVariable
When it happens
Trigger: Setting a variable to org.joda.time.LocalDate where ValueFields has no taskId but a processInstanceId is set (e.g. execution.setVariable inside a process).
Common situations: Legacy BPMN processes and delegates passing Joda LocalDate values into the variable service; gradual java.time migrations.
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/3b62048b11c9aba5.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-variable-service/src/main/java/org/flowable/variable/service/impl/types/JodaDateType.java:62
@Override
public Object getValue(ValueFields valueFields) {
Long longValue = valueFields.getLongValue();
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)