flowable/flowable-engine · error · FlowableIllegalArgumentException
unknown type '" + formProperty.getType() + "' " +…
Error message
unknown type '" + formProperty.getType() + "' " + formProperty.getId()
What it means
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.
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
Example fix
// before processEngineConfiguration.createProcessEngineConfigurationFromResource(...).buildProcessEngine(); // missing custom type // after config.setCustomFormTypes(List.of(new MyCustomFormType())); config.buildProcessEngine();
Defensive patterns
Strategy: validation
Validate before calling
// before deploy: confirm each flowable:type is a known builtin or registered customFormTypes.forEach(t -> processEngineConfiguration.getFormEngineConfiguration() /* or setCustomFormTypes */);
Try / catch
try { repositoryService.createDeployment().addClasspathResource(bpmn).deploy(); } catch (FlowableIllegalArgumentException e) { if (e.getMessage().startsWith("unknown type")) { /* register missing FormType and retry */ } else throw e; } Prevention
- Register all custom form types in engine configuration before deployment
- Keep type names consistent across environments
When it happens
Trigger: Parsing a BPMN model whose <flowable:formProperty flowable:type="..."> references a type name absent from the FormTypes map.
Common situations: 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.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- BPMN XSD could not be found
- Cannot create an event-throwing event-listener, unknown…
- Cannot create 'script' task listener. Missing ScriptInfo.
- Cannot create 'script' type execution listener. Missing…
- Cannot find activity '" + activityId + "' in process…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e75b59284dc1a474.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/form/FormTypes.java:57
AbstractFormType formType = null;
if ("date".equals(formProperty.getType()) && StringUtils.isNotEmpty(formProperty.getDatePattern())) {
boolean lenient = formProperty.getLenientDateParsing() != null ? formProperty.getLenientDateParsing() : lenientDateParsing;
formType = new DateFormType(formProperty.getDatePattern(), lenient);
} else if ("enum".equals(formProperty.getType())) {
// ACT-1023: Using linked hashmap to preserve the order in which the
// entries are defined
Map<String, String> values = new LinkedHashMap<>();
for (FormValue formValue : formProperty.getFormValues()) {
values.put(formValue.getId(), formValue.getName());
}
formType = new EnumFormType(values);
} else if (StringUtils.isNotEmpty(formProperty.getType())) {
formType = formTypes.get(formProperty.getType());
if (formType == null) {
throw new FlowableIllegalArgumentException("unknown type '" + formProperty.getType() + "' " + formProperty.getId());
}
}
return formType;
}
public boolean isLenientDateParsing() {
return lenientDateParsing;
}
public void setLenientDateParsing(boolean lenientDateParsing) {
this.lenientDateParsing = lenientDateParsing;
}
}
View on GitHub (pinned to d6d39ce1c6)