{"record":{"id":"ec03582896e568af","repo":"quarkusio/quarkus","slug":"unsupported-primitive-type-in-multipart-form-field","errorCode":null,"errorMessage":"Unsupported primitive type in multipart form field: {field.declaringClass}.{field.name}","messagePattern":"Unsupported primitive type in multipart form field: (.+?)\\.(.+?)","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":2464,"sourceCode":"                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, boolean.class), fieldValue);\n            case CHAR:\n                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, char.class), fieldValue);\n            case DOUBLE:\n                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, double.class), fieldValue);\n            case FLOAT:\n                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, float.class), fieldValue);\n            case INT:\n                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, int.class), fieldValue);\n            case LONG:\n                return methodCreator.invokeStaticMethod(\n                        MethodDescriptor.ofMethod(String.class, \"valueOf\", String.class, long.class), fieldValue);\n            default:\n                throw new IllegalArgumentException(\"Unsupported primitive type in multipart form field: \"\n                        + field.declaringClass().name() + \".\" + field.name());\n        }\n    }\n\n    private ResultHandle partFilenameHandle(BytecodeCreator methodCreator, String partFilename) {\n        return partFilename != null ? methodCreator.load(partFilename) : methodCreator.loadNull();\n    }\n\n    private void addString(BytecodeCreator methodCreator, AssignableResultHandle multipartForm, String formParamName,\n            String partType, String partFilename, ResultHandle fieldValue) {\n        if (MediaType.APPLICATION_OCTET_STREAM.equalsIgnoreCase(partType)) {\n            methodCreator.assign(multipartForm,\n                    // MultipartForm#stringFileUpload(String name, String filename, String content, String mediaType);\n                    methodCreator.invokeVirtualMethod(\n                            MethodDescriptor.ofMethod(ClientMultipartForm.class, \"stringFileUpload\",\n                                    ClientMultipartForm.class, String.class, String.class, String.class,\n                                    String.class),\n                            multipartForm,","sourceCodeStart":2446,"sourceCodeEnd":2482,"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#L2446-L2482","documentation":"When generating bytecode to convert a multipart form field value to a String part, Quarkus only supports a fixed set of primitive types (boolean, char, int, long, etc. that map to String.valueOf). Encountering an unhandled primitive kind in the switch's default branch means the field's primitive type is not supported for multipart encoding.","triggerScenarios":"A @MultipartForm bean containing a field of an unsupported primitive type (e.g. float/double/short/byte depending on supported set) sent via a REST client multipart request.","commonSituations":"DTO reuse across endpoints where multipart path doesn't handle every primitive; adding a new primitive field like `float weight` to an upload form bean.","solutions":["Change the field to a wrapper type (Float, Double, Short) — wrappers are handled via the object path or String conversion","Convert the field to String yourself in the form bean","Use a supported primitive (int, long, boolean, char) if semantically acceptable"],"exampleFix":"// before\n@RestForm\nfloat ratio;\n// after\n@RestForm\nString ratio; // or java.lang.Float","handlingStrategy":"validation","validationCode":"static void validateNoExoticPrimitives(Class<?> formBean) {\n    for (var f : formBean.getDeclaredFields()) {\n        Class<?> t = f.getType();\n        boolean ok = !t.isPrimitive()\n            || t == boolean.class || t == char.class || t == int.class || t == long.class;\n        if (!ok) throw new IllegalArgumentException(\n            \"Field \" + f.getName() + \" uses unsupported primitive \" + t + \" in multipart form; use wrapper or String\");\n    }\n}","typeGuard":"static boolean supportedPrimitive(Class<?> t) {\n    return !t.isPrimitive() || t == boolean.class || t == char.class\n        || t == int.class || t == long.class;\n}","tryCatchPattern":null,"preventionTips":["Prefer wrapper types (Integer, Long, Float) or String in multipart form beans","Keep multipart form beans minimal and purpose-built","Test multipart clients early in the build with a small integration test"],"tags":["quarkus","rest-client","multipart","primitives"],"backgroundTag":"unsupported-multipart-field-type","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"}