flowable/flowable-engine · error · FlowableException

Field type ' ' with more than one parameter is not supported

Error message

Field type '%s' with more than one parameter is not supported: %S

What it means

The legacy WSDLImporter's importStructure rejects generated field types that are generic classes with more than one type parameter. Only zero or one type parameter can be mapped to fieldParameterClass, so import of the schema structure fails. Same guard as the CxfWSDLImporter equivalent.

Solutions

  1. Modify the WSDL/XSD so fields map to non-generic or single-parameter generics (e.g. List<T> is fine, Map<K,V> is not).
  2. Use JAXB bindings customizations to remap the offending field type.
  3. Prefer the newer CxfWSDLImporter path or patch importStructure to tolerate multi-parameter types.

Example fix

// before: field mapped to Map<String,Long>
// after: custom binding mapping to wrapper
<jaxb:bindings node="xs:element[@name='counts']">
  <jaxb:class ref="com.example.CountList"/>
</jaxb:bindings>
Defensive patterns

Strategy: validation

Validate before calling

// Reject WSDL field types mapping to 2+ parameter generics before import
if (fieldType instanceof JClass && ((JClass) fieldType).getTypeParameters().size() > 1) {
    throw new IllegalArgumentException("Schema field maps to unsupported generic: " + ((JClass) fieldType).name());
}

Try / catch

try { importer.importTypes(); } catch (FlowableException e) { if (e.getMessage().contains("more than one parameter")) { /* adjust schema/bindings */ } else { throw e; } }

Prevention

When it happens

Trigger: WSDL import via WSDLImporter.importTypes -> importStructure encountering a JAXB field type with two type parameters (e.g. Map<K,V>).

Common situations: Legacy process definitions importing WSDLs with map-like types, custom JAXB customizations introducing multi-parameter generics.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/5cab2c38e9d0a805. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-cxf/src/main/java/org/flowable/engine/impl/webservice/WSDLImporter.java:196

    }

    protected void importStructure(Mapping mapping) {
        QName qname = mapping.getElement();
        JDefinedClass theClass = (JDefinedClass) mapping.getType().getTypeClass();
        SimpleStructureDefinition structure = (SimpleStructureDefinition) this.structures.get(this.namespace + qname.getLocalPart());

        Map<String, JFieldVar> fields = theClass.fields();
        int index = 0;
        for (Entry<String, JFieldVar> entry : fields.entrySet()) {

            final JType fieldType = entry.getValue().type();
            final Class<?> fieldClass = ReflectUtil.loadClass(fieldType.boxify().fullName());
            final Class<?> fieldParameterClass;
            if (fieldType instanceof JClass) {
                final JClass fieldClassType = (JClass) fieldType;
                final List<JClass> fieldTypeParameters = fieldClassType.getTypeParameters();
                if (fieldTypeParameters.size() > 1) {
                    throw new FlowableException(
                            String.format("Field type '%s' with more than one parameter is not supported: %S",
                                    fieldClassType, fieldTypeParameters));
                } else if (fieldTypeParameters.isEmpty()) {
                    fieldParameterClass = null;
                } else {
                    final JClass fieldParameterType = fieldTypeParameters.get(0);

                    // Hack because JClass.fullname() doesn't return the right class fullname for a nested class to be
                    // loaded from classloader. It should be contain "$" instead of "." as separator
                    boolean isFieldParameterTypeNeestedClass = false;
                    final Iterator<JDefinedClass> theClassNeestedClassIt = theClass.classes();
                    while (theClassNeestedClassIt.hasNext() && !isFieldParameterTypeNeestedClass) {
                        final JDefinedClass neestedType = theClassNeestedClassIt.next();
                        if (neestedType.name().equals(fieldParameterType.name())) {
                            isFieldParameterTypeNeestedClass = true;
                        }
                    }
                    if (isFieldParameterTypeNeestedClass) {

View on GitHub (pinned to d6d39ce1c6)