{"record":{"id":"e75b59284dc1a474","repo":"flowable/flowable-engine","slug":"unknown-type-formproperty-gettype","errorCode":null,"errorMessage":"unknown type '\" + formProperty.getType() + \"' \" + formProperty.getId()","messagePattern":"unknown type '\" \\+ formProperty\\.getType\\(\\) \\+ \"' \" \\+ formProperty\\.getId\\(\\)","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/form/FormTypes.java","lineNumber":57,"sourceCode":"        AbstractFormType formType = null;\n\n        if (\"date\".equals(formProperty.getType()) && StringUtils.isNotEmpty(formProperty.getDatePattern())) {\n            boolean lenient = formProperty.getLenientDateParsing() != null ? formProperty.getLenientDateParsing() : lenientDateParsing;\n            formType = new DateFormType(formProperty.getDatePattern(), lenient);\n\n        } else if (\"enum\".equals(formProperty.getType())) {\n            // ACT-1023: Using linked hashmap to preserve the order in which the\n            // 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 FlowableIllegalArgumentException(\"unknown type '\" + formProperty.getType() + \"' \" + formProperty.getId());\n            }\n        }\n        return formType;\n    }\n\n    public boolean isLenientDateParsing() {\n        return lenientDateParsing;\n    }\n\n    public void setLenientDateParsing(boolean lenientDateParsing) {\n        this.lenientDateParsing = lenientDateParsing;\n    }\n}\n","sourceCodeStart":39,"sourceCodeEnd":71,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/form/FormTypes.java#L39-L71","documentation":"Thrown by FormTypes.parseFormPropertyType when a form property declares a custom type name that is not registered in the form type registry. Flowable resolves built-in types (string, long, date, enum) plus any types registered via ProcessEngineConfiguration.setCustomFormTypes.","triggerScenarios":"Parsing a BPMN model whose <flowable:formProperty flowable:type=\"...\"> references a type name absent from the FormTypes map.","commonSituations":"Typo in the flowable:type attribute, deploying a process using a custom form type to an engine that lacks the FormType registration, or copying BPMN between engines with different registered types.","solutions":["Fix the flowable:type attribute to a built-in type (string, long, double, date, enum, boolean)","Register the custom type via processEngineConfiguration.setCustomFormTypes(...) before deploying","Check for typos in the type name in the BPMN XML"],"exampleFix":"// before\nprocessEngineConfiguration.createProcessEngineConfigurationFromResource(...).buildProcessEngine(); // missing custom type\n// after\nconfig.setCustomFormTypes(List.of(new MyCustomFormType()));\nconfig.buildProcessEngine();","handlingStrategy":"validation","validationCode":"// before deploy: confirm each flowable:type is a known builtin or registered\ncustomFormTypes.forEach(t -> processEngineConfiguration.getFormEngineConfiguration() /* or setCustomFormTypes */);","typeGuard":null,"tryCatchPattern":"try { repositoryService.createDeployment().addClasspathResource(bpmn).deploy(); } catch (FlowableIllegalArgumentException e) { if (e.getMessage().startsWith(\"unknown type\")) { /* register missing FormType and retry */ } else throw e; }","preventionTips":["Register all custom form types in engine configuration before deployment","Keep type names consistent across environments"],"tags":["flowable","form","unknown-type","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"}