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

  1. Switch the value type to java.time.LocalDate
  2. Refactor value-producing code to the java.time API
  3. 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

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


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)