quarkusio/quarkus · error · IllegalArgumentException

Unsupported multipart message element type. Expected FileAtt

Error message

Unsupported multipart message element type. Expected FileAttribute or Attribute, got: " + httpData.getClass()

What it means

While filling a multipart response POJO, the handler iterates the Netty response parts and knows how to map Attribute (plain values) and FileUpload (files). Any other Netty InterfaceHttpData subtype encountered cannot be mapped onto the target class, so mapToResponse throws IllegalArgumentException.

Source

Thrown at independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientResponseCompleteRestHandler.java:122

                        if (httpData instanceof Attribute at) {
                            // TODO: get rid of ByteArrayInputStream
                            // TODO: maybe we could extract something closer to input stream from attribute
                            ByteArrayInputStream in = new ByteArrayInputStream(
                                    at.getValue().getBytes(StandardCharsets.UTF_8));
                            Object fieldValue = context.readEntity(in,
                                    fieldFiller.getFieldType(),
                                    MediaType.valueOf(fieldFiller.getMediaType()),
                                    context.getMethodDeclaredAnnotationsSafe(),
                                    // FIXME: we have strings, it wants objects, perhaps there's
                                    // an Object->String conversion too many
                                    (MultivaluedMap) responseContext.getHeaders());
                            if (fieldValue != null) {
                                fieldFiller.set(result, fieldValue);
                            }
                        } else if (httpData instanceof FileUpload fu) {
                            fieldFiller.set(result, new FileDownloadImpl(fu));
                        } else {
                            throw new IllegalArgumentException("Unsupported multipart message element type. " +
                                    "Expected FileAttribute or Attribute, got: " + httpData.getClass());
                        }
                    }
                } // close the else block for non-EntityPart multipart
            } else {
                Class<?> rawType = context.getResponseType().getRawType();
                if (context.isFileDownload()) {
                    if (File.class.equals(rawType)) {
                        builder.entity(new File(context.getTmpFilePath()));
                    } else if (Path.class.equals(rawType)) {
                        builder.entity(Paths.get(context.getTmpFilePath()));
                    } else {
                        throw new IllegalStateException("Unhandled type: " + rawType);
                    }
                    context.clearTmpFilePath();
                } else if (!void.class.equals(rawType)) {
                    Object entity = context.readEntity(entityStream,
                            context.getResponseType(),

View on GitHub (pinned to e1c734241f)

Solutions

  1. Inspect the raw response and fix the server (or proxy) to emit standard multipart/form-data parts (Attribute/FileUpload compatible).
  2. Change the client method to return List<EntityPart> and process parts manually.
  3. Verify each part has a proper Content-Disposition name matching an annotated field on the target @MultipartForm class.
  4. Capture the response with a proxy/logger to identify the offending part type and adjust server serialization.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  List<EntityPart> parts = response.readEntity(new GenericType<List<EntityPart>>() {});
} catch (IllegalArgumentException e) {
  if (e.getMessage().startsWith("Unsupported multipart message element type")) {
    // fall back to raw body parsing / log offending part
  } else { throw e; }
}

Prevention

When it happens

Trigger: A multipart response contains a part whose Netty representation is neither Attribute nor FileUpload (e.g. an InternalAttribute/other internal data type), often due to malformed multipart content or an unexpected Content-Disposition structure produced by the server.

Common situations: Non-Java server (NGINX module, gateway) emitting non-standard multipart framing; proxy rewriting Content-Type boundaries; sending nested/complex part types the client mapping doesn't model.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/9873529f9c13aa0f. Report an issue: GitHub.