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

  1. Use java.time.LocalDate instead of org.joda.time.LocalDate
  2. Update Java delegates/listeners producing the Joda value
  3. 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

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


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)