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

  1. Fix the flowable:type attribute to a built-in type (string, long, double, date, enum, boolean)
  2. Register the custom type via processEngineConfiguration.setCustomFormTypes(...) before deploying
  3. 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

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


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)