{"record":{"id":"65e96c7422d9ec0b","repo":"quarkusio/quarkus","slug":"raw-map-parameter-types-are-not-supported-offendi","errorCode":null,"errorMessage":"Raw Map parameter types are not supported. Offending method is: {jandexMethod}","messagePattern":"Raw Map 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":3397,"sourceCode":"                componentType = type.name().toString();\n                paramArray = notNullParam.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(ToObjectArray.class, \"value\", Object[].class, Object.class),\n                        paramHandle);\n            }\n\n            addWebTargetParamToWebTarget(notNullParam, notNullParam.load(paramName), webTarget, client, genericType,\n                    paramAnnotations, paramArray, componentType, result, webTargetParamMethod, separator);\n        }\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    }","sourceCodeStart":3379,"sourceCodeEnd":3415,"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#L3379-L3415","documentation":"The REST client reactive build-time processor rejects JAX-RS client interface methods whose parameter (or return) type is a raw `Map` (declared as `Map` instead of `Map<K,V>`). It needs the key and value types at build time to generate the serialization/deserialization bytecode. A raw type leaves those types unknown, so deployment fails with this IllegalArgumentException.","triggerScenarios":"Declaring a resource method parameter like `@HeaderParam(\"h\") Map headers` or `@FormParam`/`@BeanParam` containing a raw Map in a REST client interface; the Quarkus REST client processor hits it while generating the client stub at build time.","commonSituations":"Migrating a server-side resource interface to a client interface where raw Maps compiled fine with Classic RESTEasy; generic Map used to 'simplify' method signatures; code written before generics were applied.","solutions":["Parameterize the Map, e.g. declare `Map<String, String>` or `Map<String, List<String>>` instead of raw `Map`","If the map represents form data, use `jakarta.ws.rs.core.MultivaluedMap<String, String>` with explicit type arguments","If a generic JSON object body is intended, use `Map<String, Object>` or a String/JsonNode instead of a raw Map"],"exampleFix":"// before\n@POST Response send(@HeaderParam(\"h\") Map headers);\n// after\n@POST Response send(@HeaderParam(\"h\") Map<String, String> headers);","handlingStrategy":"validation","validationCode":"if (!methodParamType.getClass().getComponentTypeOrRaw().equals(Object.class) && methodParamType instanceof Map) { /* ensure generics: */ Type t = field.getGenericType(); if (t instanceof ParameterizedType pt) { assert pt.getActualTypeArguments().length == 2; } }","typeGuard":"static boolean isParameterizedMap(java.lang.reflect.Type t) { return t instanceof ParameterizedType pt && Map.class.isAssignableFrom((Class<?>) pt.getRawType()); }","tryCatchPattern":null,"preventionTips":["Always use generic types in REST client interface method signatures","Enable compiler lint -Xlint:rawtypes to catch raw types at compile time","Review client interfaces with an arch unit test that scans for raw Map params"],"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-14T00:17:10.932Z"}