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..34a8784b5531 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 @@ -1759,22 +1759,37 @@ public void setParameterExampleValue(CodegenParameter codegenParameter, Paramete * @param codegenParameter Codegen parameter * @param requestBody Request body */ - @Override + @Override public void setParameterExampleValue(CodegenParameter codegenParameter, RequestBody requestBody) { - boolean isModel = (codegenParameter.isModel || (codegenParameter.isContainer && codegenParameter.getItems().isModel)); + if (requestBody.getContent() != null && !requestBody.getContent().isEmpty()) { + 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"); + } + } + + // FIX for #23607: Assign all named examples to the parameter so Mustache templates can access them + if (mediaType.getExamples() != null && !mediaType.getExamples().isEmpty()) { + codegenParameter.examples = mediaType.getExamples(); - 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"); + if (!isModel) { + Example example = mediaType.getExamples().values().iterator().next(); + if (example.getValue() != null) { + codegenParameter.example = example.getValue().toString(); + return; + } + } } 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..598d1fe1a7e8 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,38 @@ public void testReactiveSpringHttpInterfaceSupportListOfStringReturnTypeNoRespon "Mono> getUserIdSet" ); } + + @Test + public void shouldExposeRequestBodyNamedExamplesToTemplateContext_issue23607() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = new OpenAPIParser().readLocation( + "src/test/resources/3_0/spring/requestbody_named_examples.yaml", + null, + new ParseOptions() + ).getOpenAPI(); + + SpringCodegen codegen = new SpringCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(INTERFACE_ONLY, "true"); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); + generator.setGenerateMetadata(false); + generator.opts(input).generate(); + + // 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