{"record":{"id":"1d992255515a4ab9","repo":"quarkusio/quarkus","slug":"unknown-parameter-type","errorCode":null,"errorMessage":"Unknown parameter type ","messagePattern":"Unknown parameter type ","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/EndpointIndexer.java","lineNumber":1162,"sourceCode":"            case WILDCARD_TYPE:\n                WildcardType wildcardType = indexType.asWildcardType();\n                Type extendsBound = wildcardType.extendsBound();\n                if (extendsBound.name().equals(OBJECT)) {\n                    // this is a super bound type that we don't support\n                    throw new RuntimeException(\"Cannot handle wildcard type \" + indexType);\n                }\n                // this is an extend bound type, so we just user the bound\n                return wildcardType.name().toString();\n            case TYPE_VARIABLE:\n                TypeVariable typeVariable = indexType.asTypeVariable();\n                if (typeVariable.bounds().isEmpty()) {\n                    return Object.class.getName();\n                }\n\n                return toClassName(resolveTypeVariable(typeVariable, currentClass, actualEndpointClass, indexView),\n                        currentClass, actualEndpointClass, indexView);\n            default:\n                throw new RuntimeException(\"Unknown parameter type \" + indexType);\n        }\n    }\n\n    private static Type resolveTypeVariable(TypeVariable typeVariable, ClassInfo currentClass, ClassInfo actualEndpointClass,\n            IndexView indexView) {\n        if (typeVariable.bounds().isEmpty()) {\n            return Type.create(DotName.createSimple(Object.class.getName()), Kind.CLASS);\n        }\n        int pos = -1;\n        List<TypeVariable> typeVariables = currentClass.typeParameters();\n        for (int i = 0; i < typeVariables.size(); ++i) {\n            if (typeVariables.get(i).identifier().equals(typeVariable.identifier())) {\n                pos = i;\n                break;\n            }\n        }\n        if (pos != -1) {\n            Type resolved = resolveTypeParameters(pos, actualEndpointClass, currentClass, indexView);","sourceCodeStart":1144,"sourceCodeEnd":1180,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/common/processor/src/main/java/org/jboss/resteasy/reactive/common/processor/EndpointIndexer.java#L1144-L1180","documentation":"EndpointIndexer.toClassName encountered a Type.Kind it cannot translate to a Java class name when resolving a resource method parameter/return type. The switch's default branch throws RuntimeException('Unknown parameter type ' + indexType) for kinds not explicitly handled (e.g. parameterized types in unexpected positions, intersection types).","triggerScenarios":"Deploying an endpoint whose method signature contains a Jandex Type kind the processor does not support — typically exotic generics, intersection bounds, or nested parameterized types in the endpoint declaration.","commonSituations":"Very complex generic declarations (nested generics of generics) in resource methods; generated or bytecode-enhanced types with unusual type structures; framework versions encountering a new type shape from newer Java features.","solutions":["Simplify the endpoint method signature to concrete, non-generic or simple-generic types","Move complex generic types out of the REST layer into internal service code","Check the Quarkus/RESTEasy Reactive version; upgrade, since type-kind support grows over time; file an issue with a reproducer if it persists"],"exampleFix":"// before\n@POST\npublic void create(Map<String, Map<String, List<Set<?>>>> payload) { ... }\n// after\n@POST\npublic void create(MyDto payload) { ... }","handlingStrategy":"validation","validationCode":"// Keep endpoint signatures to supported kinds: Class, simple ParameterizedType, arrays\nstatic void validateEndpoint(Method m) {\n    java.util.ArrayDeque<java.lang.reflect.Type> q = new java.util.ArrayDeque<>();\n    q.add(m.getGenericReturnType());\n    for (java.lang.reflect.Type p : m.getGenericParameterTypes()) q.add(p);\n    while (!q.isEmpty()) {\n        java.lang.reflect.Type t = q.poll();\n        if (t instanceof ParameterizedType pt) {\n            for (java.lang.reflect.Type a : pt.getActualTypeArguments()) {\n                if (!(a instanceof Class) && !(a instanceof ParameterizedType))\n                    throw new IllegalStateException(\"Unsupported type in \" + m + \": \" + a);\n                q.add(a);\n            }\n        }\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use plain DTOs for complex data instead of deeply nested generic collections","Avoid intersection types and exotic generics in resource method signatures","Upgrade Quarkus regularly — supported type kinds expand over time","Keep a smoke build (mvn quarkus:dev) that indexes all endpoints before CI"],"tags":["quarkus","resteasy-reactive","generics","type-resolution","deployment"],"backgroundTag":"unsupported-generic-type","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"}