diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 1e8d2c7b181e..99b238f6046e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -2454,6 +2454,23 @@ public void setParameterExamples(CodegenParameter codegenParameter, Parameter pa } } + /** + * Return the examples of the request body parameter. + * + * @param codegenParameter Codegen parameter + * @param requestBody Request body + */ + public void setParameterExamples(CodegenParameter codegenParameter, RequestBody requestBody) { + if (requestBody.getContent() != null && !requestBody.getContent().isEmpty()) { + for (MediaType mediaType : requestBody.getContent().values()) { + if (mediaType.getExamples() != null && !mediaType.getExamples().isEmpty()) { + codegenParameter.examples = mediaType.getExamples(); + break; + } + } + } + } + /** * Return the example value of the parameter. * @@ -2463,6 +2480,9 @@ public void setParameterExamples(CodegenParameter codegenParameter, Parameter pa public void setParameterExampleValue(CodegenParameter codegenParameter, RequestBody requestBody) { Content content = requestBody.getContent(); + // Reuse the helper method to correctly catch examples across all media types + setParameterExamples(codegenParameter, requestBody); + Optional contentExample = ExamplesUtils.getContentExample(content); if (contentExample.isPresent()) { @@ -8290,6 +8310,9 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S codegenParameter.vendorExtensions.putAll(body.getExtensions()); } + // Ensure request body named examples are populated globally for ALL generators + setParameterExamples(codegenParameter, body); + String name = null; LOGGER.debug("Request body = {}", body); Schema schema = ModelUtils.getSchemaFromRequestBody(body); @@ -8417,11 +8440,6 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S if (original.getMinimum() != null) { codegenParameter.setMinimum(String.valueOf(original.getMinimum().doubleValue())); } - /* comment out below as we don't store `title` in the codegen parametera the moment - if (original.getTitle() != null) { - codegenParameter.setTitle(original.getTitle()); - } - */ } return codegenParameter; 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 7c1b6f3279ad..1ab1b7b78fb0 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 @@ -1751,30 +1751,7 @@ public void setParameterExampleValue(CodegenParameter codegenParameter, Paramete setParameterExampleValue(codegenParameter); } - - /** - * Return the example value of the parameter. Overrides the parent method in DefaultCodegen - * to not set examples on complex models, as they don't compile properly. - * - * @param codegenParameter Codegen parameter - * @param requestBody Request body - */ - @Override - public void setParameterExampleValue(CodegenParameter codegenParameter, RequestBody requestBody) { - boolean isModel = (codegenParameter.isModel || (codegenParameter.isContainer && codegenParameter.getItems().isModel)); - - MediaType mediaType = requestBody.getContent().values().iterator().next(); - boolean hasExample = mediaType.getExample() != null || (mediaType.getExamples() != null && !mediaType.getExamples().isEmpty()); - if (isModel) { - if (hasExample) { - once(LOGGER).warn("Ignoring complex example on request body"); - } - setParameterExampleValue(codegenParameter); - } else { - super.setParameterExampleValue(codegenParameter, requestBody); - } - } - + @Override public void setParameterExampleValue(CodegenParameter p) { String example; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index 5525fc9676e5..b487548021cb 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -8690,4 +8690,29 @@ public void testReactiveSpringHttpInterfaceSupportListOfStringReturnTypeNoRespon "Mono> getUserIdSet" ); } + + @Test + public void shouldExposeRequestBodyNamedExamplesToTemplateContext_issue23607() throws IOException { + OpenAPI openAPI = new OpenAPIParser().readLocation( + "src/test/resources/3_0/spring/requestbody_named_examples.yaml", + null, + new ParseOptions() + ).getOpenAPI(); + + SpringCodegen codegen = new SpringCodegen(); + codegen.additionalProperties().put(INTERFACE_ONLY, "true"); + + // Preprocess and set OpenAPI to mirror DefaultGenerator behavior + codegen.preprocessOpenAPI(openAPI); + codegen.setOpenAPI(openAPI); + + // Verify via codegen operation inspection after initialization + Operation operation = openAPI.getPaths().get("/users").getPost(); + CodegenOperation codegenOperation = codegen.fromOperation("/users", "POST", operation, null); + + assertNotNull(codegenOperation.bodyParam); + assertNotNull(codegenOperation.bodyParam.examples); + assertTrue(codegenOperation.bodyParam.examples.containsKey("Jessica")); + assertTrue(codegenOperation.bodyParam.examples.containsKey("Ron")); + } } \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/requestbody_named_examples.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/requestbody_named_examples.yaml new file mode 100644 index 000000000000..cde7811839e0 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/requestbody_named_examples.yaml @@ -0,0 +1,36 @@ +openapi: 3.0.0 +info: + title: Example API + version: 1.0.0 +paths: + /users: + post: + summary: Adds a new user + tags: + - User + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/User" + examples: + Jessica: + value: + id: 10 + name: Jessica Smith + Ron: + value: + id: 11 + name: Ron Stewart + responses: + "200": + description: OK +components: + schemas: + User: + type: object + properties: + id: + type: integer + name: + type: string \ No newline at end of file