From d3cb3f2c3d9f6c5f76be8956035328057e19c07d Mon Sep 17 00:00:00 2001 From: bdurca Date: Tue, 24 Feb 2026 08:35:14 +0100 Subject: [PATCH 1/3] Fix fix that child constructor was invalid when having readonly field in parent --- .../Java/libraries/microprofile/pojo.mustache | 4 +- .../JavaMicroprofileServerCodegenTest.java | 26 ++++++++++++ .../src/test/resources/bugs/issue_23034.yaml | 41 +++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/pojo.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/pojo.mustache index 36a0fd4042fd..b9dd27ddcec3 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/pojo.mustache @@ -52,10 +52,10 @@ public class {{classname}} {{#parent}}extends {{{.}}}{{/parent}}{{#vendorExtensi {{{.}}} {{/vendorExtensions.x-field-extra-annotation}} {{#isContainer}} - private {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}}; + protected {{{datatypeWithEnum}}} {{name}}{{#required}} = {{{defaultValue}}}{{/required}}{{^required}} = null{{/required}}; {{/isContainer}} {{^isContainer}} - private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}; + protected {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}}; {{/isContainer}} {{/vars}} {{>additional_properties}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java index 06cb837baa6d..1baeb03a9028 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java @@ -235,5 +235,31 @@ public void testGeneratedApiExceptionMapperDoesNotHaveProviderAnnotationWhenDisa .assertTypeAnnotations() .doesNotContainWithName("Provider"); } + + @Test + public void testClientCanAccessFieldInParent() throws Exception { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/bugs/issue_23034.yaml", null, new ParseOptions()).getOpenAPI(); + + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(JavaClientCodegen.MICROPROFILE_GLOBAL_EXCEPTION_MAPPER, "false"); + + ClientOptInput input = new ClientOptInput() + .openAPI(openAPI) + .config(codegen); + + List files = new DefaultGenerator().opts(input).generate(); + + Map filesMap = files.stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + + validateJavaSourceFiles(files); + + JavaFileAssert.assertThat(filesMap.get("Parent.java")) + .fileContains("protected parentField"); + } } diff --git a/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml b/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml new file mode 100644 index 000000000000..207edba74ac8 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml @@ -0,0 +1,41 @@ +--- +openapi: 3.0.4 +info: + title: Reproduce + version: 'v1' +components: + schemas: + Child: + required: + - childField1 + type: object + allOf: + - $ref: "#/components/schemas/Parent" + properties: + childField1: + type: string + + Parent: + required: + - parentField + type: object + properties: + parentField: + type: string + readOnly: true + discriminator: + propertyName: classType + mapping: + Child: "#/components/schemas/Child" +paths: + '/v1/reproduce': + get: + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Child' + description: 'reproduce' \ No newline at end of file From 9156902a720cbd5dfd0eba8720a03743e0673736 Mon Sep 17 00:00:00 2001 From: bdurca Date: Tue, 24 Feb 2026 09:14:33 +0100 Subject: [PATCH 2/3] add classType field --- .../src/test/resources/bugs/issue_23034.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml b/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml index 207edba74ac8..f8679e6e90f8 100644 --- a/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml +++ b/modules/openapi-generator/src/test/resources/bugs/issue_23034.yaml @@ -17,12 +17,18 @@ components: Parent: required: + - classType - parentField type: object properties: parentField: type: string readOnly: true + classType: + description: Identifier of discriminator mapping class. + enum: + - Child + type: string discriminator: propertyName: classType mapping: From eb402156f7efd40f6e44bb8d4917ba0454f66b02 Mon Sep 17 00:00:00 2001 From: bdurca Date: Tue, 24 Feb 2026 09:30:12 +0100 Subject: [PATCH 3/3] fix test --- .../java/microprofile/JavaMicroprofileServerCodegenTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java index 1baeb03a9028..bdd62ed6fdd5 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/microprofile/JavaMicroprofileServerCodegenTest.java @@ -259,7 +259,7 @@ public void testClientCanAccessFieldInParent() throws Exception { validateJavaSourceFiles(files); JavaFileAssert.assertThat(filesMap.get("Parent.java")) - .fileContains("protected parentField"); + .fileContains("protected String parentField;"); } }