{"record":{"id":"15e1e389072d15db","repo":"flowable/flowable-engine","slug":"unknown-type-type-id","errorCode":null,"errorMessage":"unknown type '${type}' ${id}","messagePattern":"unknown type '(.+?)' (.+?)","errorType":"validation","errorClass":"ActivitiIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/form/FormTypes.java","lineNumber":54,"sourceCode":"\n    public AbstractFormType parseFormPropertyType(FormProperty formProperty) {\n        AbstractFormType formType = null;\n\n        if (\"date\".equals(formProperty.getType()) && StringUtils.isNotEmpty(formProperty.getDatePattern())) {\n            formType = new DateFormType(formProperty.getDatePattern());\n\n        } else if (\"enum\".equals(formProperty.getType())) {\n            // ACT-1023: Using linked hashmap to preserve the order in which the entries are defined\n            Map<String, String> values = new LinkedHashMap<>();\n            for (FormValue formValue : formProperty.getFormValues()) {\n                values.put(formValue.getId(), formValue.getName());\n            }\n            formType = new EnumFormType(values);\n\n        } else if (StringUtils.isNotEmpty(formProperty.getType())) {\n            formType = formTypes.get(formProperty.getType());\n            if (formType == null) {\n                throw new ActivitiIllegalArgumentException(\"unknown type '\" + formProperty.getType() + \"' \" + formProperty.getId());\n            }\n        }\n        return formType;\n    }\n}\n","sourceCodeStart":36,"sourceCodeEnd":60,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/form/FormTypes.java#L36-L60","documentation":"FormTypes.parseFormPropertyType throws ActivitiIllegalArgumentException when a form property in the BPMN XML declares a type that has not been registered in the engine's form type registry (string, long, date, enum, boolean are built in). The lookup formTypes.get(type) returned null so no FormType exists to parse/convert values.","triggerScenarios":"Deploying/starting a process whose <activiti:formProperty id=... type=\"customType\"/> names a type never registered via ProcessEngineConfigurationImpl.setFormTypes or a custom FormType name with a typo.","commonSituations":"Custom form type class exists but was never registered on the engine configuration; upgrade removed/renamed a custom type; typo like 'dtae' instead of 'date'; copy-pasted type name from another engine.","solutions":["Register the custom type: processEngineConfiguration.getFormTypes().addFormType(new MyFormType()) before deploying/starting","Fix the type attribute spelling in the BPMN XML to a built-in type (string, long, boolean, date, enum)","Verify deployment/upgrade did not drop custom FormType registrations"],"exampleFix":"// before\n<activiti:formProperty id=\"color\" type=\"colour\"/>  // unknown\n// after\n<activiti:formProperty id=\"color\" type=\"string\"/>\n// or register it:\nprocessEngineConfiguration.getFormTypes().addFormType(new ColourFormType());","handlingStrategy":"validation","validationCode":"Set<String> known = formTypes.getFormTypes(); // FormTypes exposes registered names\nif (!known.contains(formProperty.getType()))\n    throw new IllegalArgumentException(\"Register or fix form type: \" + formProperty.getType());","typeGuard":null,"tryCatchPattern":"try {\n    repositoryService.createDeployment().addClasspathResource(\"process.bpmn20.xml\").deploy();\n} catch (ActivitiIllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"unknown type\")) { /* register custom FormType, redeploy */ }\n    else throw e;\n}","preventionTips":["Register all custom FormTypes in engine configuration before deployment","Keep a central list of allowed type names and validate BPMN against it","Lint BPMN form property types in CI"],"tags":["forms","configuration","bpmn"],"backgroundTag":"invalid-enum-value","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"}