From c4c5c8206c5c646cb98f328befaecba9f3d025f5 Mon Sep 17 00:00:00 2001 From: anupamchaubey Date: Sat, 6 Jun 2026 14:36:35 +0530 Subject: [PATCH] fix(java): map OpenAPI 3.1 null type to Object to prevent ModelNull generation --- .../languages/AbstractJavaCodegen.java | 27 ++++++++++++++++--- .../codegen/java/JavaClientCodegenTest.java | 9 +++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 14274d55708a..22b10107803e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -303,6 +303,7 @@ public AbstractJavaCodegen() { typeMapping.put("date", "Date"); typeMapping.put("file", "File"); typeMapping.put("AnyType", "Object"); + typeMapping.put("null", "Object"); importMapping.put("BigDecimal", "java.math.BigDecimal"); importMapping.put("UUID", "java.util.UUID"); @@ -1093,6 +1094,11 @@ public String toModelFilename(String name) { @Override public String getTypeDeclaration(Schema p) { + // Intercept "null" explicitly to prevent complex object resolution + if (p != null && "null".equalsIgnoreCase(p.getType())) { + return "Object"; + } + Schema schema = unaliasSchema(p); Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; if (ModelUtils.isArraySchema(target)) { @@ -1866,16 +1872,29 @@ public String toExampleValue(Schema p) { @Override public String getSchemaType(Schema p) { + if (p == null) { + LOGGER.error("Schema is null"); + return "Object"; + } + + // 1. First, call the parent method to extract the schema type string String openAPIType = super.getSchemaType(p); - // don't apply renaming on types from the typeMapping + if (null == openAPIType) { + LOGGER.error("No Type defined for Schema {}", p); + return "Object"; // Safe fallback to prevent NullPointerException later + } + + // 2. Intercept the "null" type string immediately before it routes to typeMapping or toModelName + if ("null".equalsIgnoreCase(openAPIType) || "null".equalsIgnoreCase(p.getType())) { + return "Object"; + } + + // 3. Don't apply renaming on types from the typeMapping if (typeMapping.containsKey(openAPIType)) { return typeMapping.get(openAPIType); } - if (null == openAPIType) { - LOGGER.error("No Type defined for Schema {}", p); - } return toModelName(openAPIType); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index dc5e1378ee6e..ef58276873bd 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -4556,6 +4556,15 @@ public void testSwagger2TagImportRestAssured() throws IOException { assertThat(content) .contains("import io.swagger.v3.oas.annotations.tags.*;") .contains("@Tag("); + + } + + @Test + public void testNullTypeMapsToObject() { + final JavaClientCodegen codegen = new JavaClientCodegen(); + Schema nullSchema = new Schema().type("null"); + Assert.assertEquals(codegen.getSchemaType(nullSchema), "Object"); + Assert.assertEquals(codegen.getTypeDeclaration(nullSchema), "Object"); } }