From 24df88bf4638f4ca90dcec6487c44257db007b51 Mon Sep 17 00:00:00 2001 From: Eric Lawson Date: Fri, 22 May 2026 13:34:37 -0600 Subject: [PATCH] fix(core): recognize OAS 3.1 contentMediaType for binary classification Extend ModelUtils.isBinarySchema to recognize contentMediaType: application/octet-stream alongside the existing format: binary check. OpenAPI 3.1 / JSON Schema 2020-12 uses contentMediaType as the binary-content signal, but openapi-generator only matched format: binary, so 3.1 specs failed to classify file fields and were routed through plain form params rather than multipart binary parts. format: binary remains valid in 3.1 and continues to match. --- .../codegen/utils/ModelUtils.java | 5 ++-- .../codegen/utils/ModelUtilsTest.java | 15 ++++++++++ .../src/test/resources/3_0/binary-schema.yaml | 26 +++++++++++++++++ .../src/test/resources/3_1/binary-schema.yaml | 29 +++++++++++++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/binary-schema.yaml create mode 100644 modules/openapi-generator/src/test/resources/3_1/binary-schema.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java index 88346d9046f7..e0f552e5d598 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java @@ -743,9 +743,10 @@ public static boolean isByteArraySchema(Schema schema) { public static boolean isBinarySchema(Schema schema) { return (schema instanceof BinarySchema) || - // format: binary + // format: binary, or contentMediaType: application/octet-stream (OAS 3.1) (SchemaTypeUtil.STRING_TYPE.equals(getType(schema)) - && SchemaTypeUtil.BINARY_FORMAT.equals(schema.getFormat())); + && (SchemaTypeUtil.BINARY_FORMAT.equals(schema.getFormat()) + || "application/octet-stream".equals(schema.getContentMediaType()))); } public static boolean isFileSchema(Schema schema) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java index 906ace829bcb..0b46d6545dc7 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/utils/ModelUtilsTest.java @@ -750,6 +750,21 @@ public void testModelWithPropertiesOnly() { assertFalse(ModelUtils.isModelWithPropertiesOnly(testSchema)); } + @Test + public void testIsBinarySchemaOAS30FormatBinary() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/binary-schema.yaml"); + Schema fileProp = (Schema) ModelUtils.getSchema(openAPI, "UploadBody").getProperties().get("file"); + assertTrue(ModelUtils.isBinarySchema(fileProp)); + } + + @Test + public void testIsBinarySchemaOAS31ContentMediaType() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_1/binary-schema.yaml"); + Map props = ModelUtils.getSchema(openAPI, "UploadBody").getProperties(); + assertTrue(ModelUtils.isBinarySchema(props.get("file"))); + assertFalse(ModelUtils.isBinarySchema(props.get("image"))); + } + @Test public void getParentNameMultipleInterfacesTest() { OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/oneOf_innerModel.yaml"); diff --git a/modules/openapi-generator/src/test/resources/3_0/binary-schema.yaml b/modules/openapi-generator/src/test/resources/3_0/binary-schema.yaml new file mode 100644 index 000000000000..de9d8c5ab13f --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/binary-schema.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.3 +info: + title: t + version: 1.0.0 +paths: + /upload: + post: + operationId: upload + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/UploadBody' + responses: + '200': + description: ok +components: + schemas: + UploadBody: + type: object + properties: + file: + type: string + format: binary + required: + - file diff --git a/modules/openapi-generator/src/test/resources/3_1/binary-schema.yaml b/modules/openapi-generator/src/test/resources/3_1/binary-schema.yaml new file mode 100644 index 000000000000..4852de8e267d --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_1/binary-schema.yaml @@ -0,0 +1,29 @@ +openapi: 3.1.0 +info: + title: t + version: 1.0.0 +paths: + /upload: + post: + operationId: upload + requestBody: + content: + multipart/form-data: + schema: + $ref: '#/components/schemas/UploadBody' + responses: + '200': + description: ok +components: + schemas: + UploadBody: + type: object + properties: + file: + type: string + contentMediaType: application/octet-stream + image: + type: string + contentMediaType: image/png + required: + - file