{"record":{"id":"46b24f43fdf65b8d","repo":"flowable/flowable-engine","slug":"using-joda-time-localdate-has-been-deprecated-and","errorCode":null,"errorMessage":"Using Joda-Time LocalDate has been deprecated and will be removed in a future version. Input variable {} from {} {} for decision table {} is a Joda-Time LocalDate. ","messagePattern":"Using Joda-Time LocalDate has been deprecated and will be removed in a future version\\. Input variable (.+?) from (.+?) (.+?) for decision table (.+?) is a Joda-Time LocalDate\\. ","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExecutionContextBuilder.java","lineNumber":123,"sourceCode":"        for (OutputClause outputClause : decisionTable.getOutputs()) {\n            if (!inputVariables.containsKey(outputClause.getName()) || inputVariables.get(outputClause.getName()) == null) {\n                if (\"number\".equals(outputClause.getTypeRef())) {\n                    inputVariables.put(outputClause.getName(), 0D);\n                } else if (\"date\".equals(outputClause.getTypeRef())) {\n                    inputVariables.put(outputClause.getName(), new Date());\n                } else {\n                    inputVariables.put(outputClause.getName(), \"\");\n                }\n            }\n        }\n\n        // check if transformation is needed\n        for (Map.Entry<String, Object> inputVariable : inputVariables.entrySet()) {\n            String inputVariableName = inputVariable.getKey();\n            try {\n                Object inputVariableValue = inputVariable.getValue();\n                if (inputVariableValue instanceof LocalDate) {\n                    JodaDeprecationLogger.LOGGER.warn(\n                            \"Using Joda-Time LocalDate has been deprecated and will be removed in a future version.\"\n                                    + \" Input variable {} from {} {} for decision table {} is a Joda-Time LocalDate. \",\n                            inputVariableName, executeDecisionInfo.getScopeType(), executeDecisionInfo.getInstanceId(), decisionTable.getId());\n                    Date transformedDate = ((LocalDate) inputVariableValue).toDate();\n                    inputVariables.put(inputVariableName, transformedDate);\n                } else if (inputVariableValue instanceof java.time.LocalDate) {\n                    Date transformedDate = Date.from(((java.time.LocalDate) inputVariableValue).atStartOfDay()\n                            .atZone(ZoneId.systemDefault())\n                            .toInstant());\n                    inputVariables.put(inputVariableName, transformedDate);\n                } else if (inputVariableValue instanceof Long || inputVariableValue instanceof Integer) {\n                    BigInteger transformedNumber = new BigInteger(inputVariableValue.toString());\n                    inputVariables.put(inputVariableName, transformedNumber);\n                } else if (inputVariableValue instanceof Double ) {\n                    BigDecimal transformedNumber = new BigDecimal((Double) inputVariableValue);\n                    inputVariables.put(inputVariableName, transformedNumber);\n                } else if (inputVariableValue instanceof Float) {\n                    double doubleValue = Double.parseDouble(inputVariableValue.toString());","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/el/ELExecutionContextBuilder.java#L105-L141","documentation":"A deprecation WARN from ELExecutionContextBuilder.preProcessInputVariables: a Joda-Time org.joda.time.LocalDate was passed as an input variable when executing a decision table. Flowable transparently converts it to java.util.Date, but Joda-Time support will be removed in a future version.","triggerScenarios":"Calling DecisionService.executeExecuteDecision... (e.g. dmnEngine.getDecisionService().executeWithSingleResult(...)) with a variables map containing a Joda-Time LocalDate value for a decision table input.","commonSituations":"Legacy codebases still on Joda-Time; code migrated from older Flowable/Activiti versions that used Joda types as process variables; third-party libraries returning Joda dates that are passed straight into DMN execution.","solutions":["Convert the variable to java.time.LocalDate (or java.util.Date) before invoking the decision.","Search the calling code for org.joda.time imports and migrate to java.time (Joda is EOL).","If conversion happens deep in a stack, add an explicit mapping layer over the input-variable map."],"exampleFix":"// before\nvars.put(\"birthDate\", org.joda.time.LocalDate.now());\n// after\nvars.put(\"birthDate\", java.time.LocalDate.now());","handlingStrategy":"type-guard","validationCode":"if (vars.values().stream().anyMatch(v -> v instanceof org.joda.time.LocalDate)) { throw new IllegalArgumentException(\"Joda LocalDate not supported\"); }","typeGuard":"boolean isJodaLocalDate(Object v) { return v instanceof org.joda.time.LocalDate; }","tryCatchPattern":null,"preventionTips":["Ban org.joda.time imports via Checkstyle/ArchUnit","Use java.time.LocalDate for all DMN input variables","Add a mapping layer over decision input maps"],"tags":["dmn","deprecation","joda-time","date"],"backgroundTag":"deprecated-api-usage","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}