{"record":{"id":"556e6274bb353d07","repo":"OpenAPITools/openapi-generator","slug":"only-single-item-type-is-supported-when-sse-is-de","errorCode":null,"errorMessage":"only single item type is supported, when SSE is detected","messagePattern":"only single item type is supported, when SSE is detected","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java","lineNumber":1525,"sourceCode":"            if (schemaTypes.containsKey(\"array\")) {\n                // we have a match with SSE pattern\n                // double check potential conflicting, multiple specs\n                if (schemaTypes.size() > 1) {\n                    throw new RuntimeException(\"only 1 response media type supported, when SSE is detected\");\n                }\n                // double check schema format\n                List<Schema> eventTypes = schemaTypes.get(\"array\");\n                if (eventTypes.stream().anyMatch(schema -> !\"event-stream\".equalsIgnoreCase(schema.getFormat()))) {\n                    throw new RuntimeException(\"schema format 'event-stream' is required, when SSE is detected\");\n                }\n                // double check item types\n                Set<String> itemTypes = eventTypes.stream()\n                        .map(schema -> schema.getItems().getType() != null\n                                ? schema.getItems().getType()\n                                : schema.getItems().get$ref())\n                        .collect(Collectors.toSet());\n                if (itemTypes.size() > 1) {\n                    throw new RuntimeException(\"only single item type is supported, when SSE is detected\");\n                }\n                codegenOperation.vendorExtensions.put(\"x-sse\", true);\n            } // Not an SSE compliant definition\n        }\n\n        // If substituteGenericPagedModel is enabled, replace paged-model return types\n        // with org.springframework.data.web.PagedModel<T>.\n        if (substituteGenericPagedModel && !pagedModelRegistry.isEmpty()\n                && codegenOperation.returnBaseType != null) {\n            PagedModelScanUtils.DetectedPagedModel detected =\n                    pagedModelRegistry.get(codegenOperation.returnBaseType);\n            if (detected != null) {\n                String oldType = codegenOperation.returnType;\n                // Run through toModelName so that schemaMappings (e.g. User → com.example.MyUser)\n                // are honored: the mapped name is used both in the type arg and for import resolution.\n                String itemType = toModelName(detected.itemSchemaName);\n                codegenOperation.returnType = pagedModelClassName + \"<\" + itemType + \">\";\n                codegenOperation.returnBaseType = pagedModelClassName;","sourceCodeStart":1507,"sourceCodeEnd":1543,"githubUrl":"https://github.com/OpenAPITools/openapi-generator/blob/fcec517be3cf5b7964296bcba25fbc97541484e7/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java#L1507-L1543","documentation":"For an operation recognised as SSE, the generator collects the item types (the type or $ref of items) of every text/event-stream array schema across 2xx responses. A reactive stream endpoint can emit only one element type (Flux<T>), so more than one distinct item type aborts generation.","triggerScenarios":"Two 2xx event-stream responses whose arrays hold different item schemas (e.g. items: $ref Cat on one, items: $ref Dog on the other), or one array of primitives and one array of objects.","commonSituations":"Streaming APIs that send different event payloads for different success codes; specs where one event type was renamed in a $ref but not everywhere; merging specs that each defined their own event schema.","solutions":["Point every text/event-stream array at the same item $ref or primitive type.","If different event shapes must be streamed, define one envelope schema with oneOf/anyOf variants as the single item type."],"exampleFix":"# before\n'200':\n  content:\n    text/event-stream:\n      schema: { type: array, format: event-stream, items: { $ref: '#/components/schemas/Cat' } }\n'201':\n  content:\n    text/event-stream:\n      schema: { type: array, format: event-stream, items: { $ref: '#/components/schemas/Dog' } }\n\n# after\ncomponents:\n  schemas:\n    PetEvent:\n      oneOf: [ { $ref: '#/components/schemas/Cat' }, { $ref: '#/components/schemas/Dog' } ]\n'200':\n  content:\n    text/event-stream:\n      schema: { type: array, format: event-stream, items: { $ref: '#/components/schemas/PetEvent' } }","handlingStrategy":"validation","validationCode":"// node: all event-stream arrays in an operation must share one item type\nconst checkSseItems = (op) => {\n  const items = Object.values(op.responses || {})\n    .map(r => r.content?.['text/event-stream']?.schema)\n    .filter(s => s?.type === 'array')\n    .map(s => s.items?.$ref ?? s.items?.type);\n  if (new Set(items).size > 1) throw new Error(`multiple SSE item types: ${items.join(',')}`);\n};","typeGuard":null,"tryCatchPattern":"// Java\ntry { new DefaultGenerator().opts(input).generate(); }\ncatch (RuntimeException e) {\n    // unify item schemas (oneOf envelope) in the spec, then regenerate\n}","preventionTips":["Model heterogeneous events as one envelope schema with oneOf variants.","Lint for a single item $ref per SSE operation.","Version event schemas centrally so renamed $refs propagate to all responses."],"tags":["spring","sse","openapi","spec-validation"],"backgroundTag":"sse-schema-validation","analyzedSha":"fcec517be3cf5b7964296bcba25fbc97541484e7","analyzedAt":"2026-08-22T11:13:11.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}