{"record":{"id":"a7c566077ba5d4d0","repo":"quarkusio/quarkus","slug":"cycle-detected-in-beanparam-annotations-already-p","errorCode":null,"errorMessage":"Cycle detected in BeanParam annotations; already processed class \" + beanParamClass.name()","messagePattern":"Cycle detected in BeanParam annotations; already processed class \" \\+ beanParamClass\\.name\\(\\)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/processor/src/main/java/org/jboss/resteasy/reactive/client/processor/beanparam/BeanParamParser.java","lineNumber":52,"sourceCode":"import org.jboss.jandex.MethodInfo;\nimport org.jboss.jandex.Type;\nimport org.jboss.resteasy.reactive.common.processor.AsmUtil;\nimport org.jboss.resteasy.reactive.common.processor.JandexUtil;\nimport org.jboss.resteasy.reactive.common.processor.JavaBeanUtil;\nimport org.jboss.resteasy.reactive.common.processor.ResteasyReactiveDotNames;\nimport org.jboss.resteasy.reactive.common.processor.StringUtil;\n\npublic class BeanParamParser {\n\n    public static List<Item> parse(ClassInfo beanParamClass, IndexView index) {\n        Set<ClassInfo> processedBeanParamClasses = Collections.newSetFromMap(new IdentityHashMap<>());\n        return parseInternal(beanParamClass, index, processedBeanParamClasses);\n    }\n\n    private static List<Item> parseInternal(ClassInfo beanParamClass, IndexView index,\n            Set<ClassInfo> processedBeanParamClasses) {\n        if (!processedBeanParamClasses.add(beanParamClass)) {\n            throw new IllegalArgumentException(\"Cycle detected in BeanParam annotations; already processed class \"\n                    + beanParamClass.name());\n        }\n\n        try {\n            List<Item> resultList = new ArrayList<>();\n\n            // Parse class tree recursively\n            if (!JandexUtil.DOTNAME_OBJECT.equals(beanParamClass.superName())) {\n                resultList\n                        .addAll(parseInternal(index.getClassByName(beanParamClass.superName()), index,\n                                processedBeanParamClasses));\n            }\n\n            resultList.addAll(paramItemsForFieldsAndMethods(beanParamClass, QUERY_PARAM,\n                    (annotationValue, fieldInfo) -> new QueryParamItem(fieldInfo.name(), annotationValue,\n                            fieldInfo.hasDeclaredAnnotation(ENCODED),\n                            new FieldExtractor(null, fieldInfo.name(), fieldInfo.declaringClass().name().toString()),\n                            fieldInfo.type()),","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/processor/src/main/java/org/jboss/resteasy/reactive/client/processor/beanparam/BeanParamParser.java#L34-L70","documentation":"Build-time error from BeanParamParser.parseInternal: while recursively expanding @BeanParam types, a class was encountered that is already on the processing stack — i.e. the bean param composition is cyclic (a bean param type that (transitively) embeds itself). The already-processed class name is appended to the message.","triggerScenarios":"Thrown at independent-projects/resteasy-reactive/client/processor/src/main/java/org/jboss/resteasy/reactive/client/processor/beanparam/BeanParamParser.java:52 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Break the cycle in the @BeanParam object graph — remove the self-reference or mutual nesting","Use @Context or a separate resource method parameter instead of nesting the same bean param type"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}