{"record":{"id":"2c899242d85a764c","repo":"quarkusio/quarkus","slug":"raw-multivaluedmap-parameter-types-are-not-support","errorCode":null,"errorMessage":"Raw MultivaluedMap parameter types are not supported. Offending method is: {jandexMethod}","messagePattern":"Raw MultivaluedMap parameter types are not supported\\. Offending method is: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest-client-jaxrs/deployment/src/main/java/io/quarkus/jaxrs/client/reactive/deployment/JaxrsClientReactiveProcessor.java","lineNumber":3405,"sourceCode":"        }\n\n        isParamNull.trueBranch().assign(result, webTarget);\n\n        return result;\n    }\n\n    private Map.Entry<Type, Type> resolveMapTypes(Type type, MethodInfo jandexMethod) {\n        if (type.name().equals(ResteasyReactiveDotNames.MAP)) {\n            if (type.kind() != PARAMETERIZED_TYPE) {\n                throw new IllegalArgumentException(\n                        \"Raw Map parameter types are not supported. Offending method is: \" + jandexMethod);\n            }\n            var parameterizedType = type.asParameterizedType();\n            var arguments = parameterizedType.arguments();\n            return new AbstractMap.SimpleEntry<>(arguments.get(0), arguments.get(1));\n        } else if (type.name().equals(ResteasyReactiveDotNames.MULTI_VALUED_MAP)) {\n            if (type.kind() != PARAMETERIZED_TYPE) {\n                throw new IllegalArgumentException(\n                        \"Raw MultivaluedMap parameter types are not supported. Offending method is: \" + jandexMethod);\n            }\n            var parameterizedType = type.asParameterizedType();\n            var arguments = parameterizedType.arguments();\n            return new AbstractMap.SimpleEntry<>(arguments.get(0), ParameterizedType.create(ResteasyReactiveDotNames.LIST,\n                    new Type[] { arguments.get(1) }, null));\n        }\n        // TODO: we could support this if necessary by looking up the resolved types via JandexUtil.resolveTypeParameters\n        throw new IllegalArgumentException(\"Unsupported Map type '\" + type.name() + \"'. Offending method is: \" + jandexMethod);\n    }\n\n    private BranchResult iteratorHasNext(BytecodeCreator creator, ResultHandle iterator) {\n        return creator.ifTrue(\n                creator.invokeInterfaceMethod(ofMethod(Iterator.class, \"hasNext\", boolean.class), iterator));\n    }\n\n    private void addWebTargetParamToWebTarget(BytecodeCreator creator, ResultHandle paramName,\n            ResultHandle webTarget,","sourceCodeStart":3387,"sourceCodeEnd":3423,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest-client-jaxrs/deployment/src/main/java/io/quarkus/jaxrs/client/reactive/deployment/JaxrsClientReactiveProcessor.java#L3387-L3423","documentation":"Same build-time check as the raw Map case, but specifically for `jakarta.ws.rs.core.MultivaluedMap`. The client processor must know the key/value types to generate code that populates headers or form params, and a raw MultivaluedMap provides no type information. Deployment aborts with this IllegalArgumentException.","triggerScenarios":"A REST client interface method with a raw `MultivaluedMap` parameter (e.g. `@FormParam` body `MultivaluedMap form`), processed at build time by JaxrsClientReactiveProcessor.","commonSituations":"Copying resource method signatures from tutorials that omit generics; refactoring `Map` to `MultivaluedMap` without adding type arguments; legacy JAX-RS code using raw types.","solutions":["Declare `MultivaluedMap<String, String>` with explicit type arguments (the processor wraps the value type in List automatically)","If you need multiple values per key as a plain body, use `Map<String, List<String>>` instead","For arbitrary JSON bodies use `Map<String, Object>` or `String` with a custom serializer"],"exampleFix":"// before\n@POST void submit(MultivaluedMap form);\n// after\n@POST void submit(MultivaluedMap<String, String> form);","handlingStrategy":"validation","validationCode":"if (param instanceof MultivaluedMap mv) { if (mv.getClass().getGenericSuperclass() instanceof ParameterizedType) { /* ok */ } else throw new IllegalArgumentException(\"MultivaluedMap must be parameterized\"); }","typeGuard":"static boolean isParameterizedMultivaluedMap(java.lang.reflect.Type t) { return t instanceof ParameterizedType pt && MultivaluedMap.class.isAssignableFrom((Class<?>) pt.getRawType()); }","tryCatchPattern":null,"preventionTips":["Prefer MultivaluedMap<String,String> for form/headers","Run build with -Xlint:rawtypes","Add code review checklist item for REST client interface generics"],"tags":["rest-client","build-time","generics","quarkus"],"backgroundTag":"raw-type-map-parameter","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}