diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/jackson_annotations.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/jackson_annotations.mustache index 0668f40785ce..18653943272d 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/jackson_annotations.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/jackson_annotations.mustache @@ -1,4 +1,4 @@ - @JsonProperty("{{baseName}}") + @JsonProperty({{#isReadOnly}}value = {{/isReadOnly}}"{{baseName}}"{{#isReadOnly}}, access = JsonProperty.Access.READ_ONLY{{/isReadOnly}}) {{#withXml}} @JacksonXmlProperty(localName = "{{items.xmlName}}{{^items.xmlName}}{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}{{/items.xmlName}}"{{#isXmlAttribute}}, isAttribute = true{{/isXmlAttribute}}{{#xmlNamespace}}, namespace = "{{.}}"{{/xmlNamespace}}) {{#isContainer}} 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 0bd582e30076..53400571187a 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 @@ -9398,4 +9398,37 @@ public void oneOfDiscriminatorType(String filename, boolean resolveInlineEnum, S .fileContains(expectedContains); } + @Test + public void readOnlyPropertiesGetJsonPropertyAnnotation() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/readonly-properties-test.yaml", null, new ParseOptions()).getOpenAPI(); + + SpringCodegen codegen = new SpringCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); + generator.setGenerateMetadata(false); + generator.opts(input).generate(); + + // Verify that readOnly properties generate @JsonProperty with access=READ_ONLY + // while non-readOnly properties keep the simple @JsonProperty("name") format + JavaFileAssert.assertThat(Paths.get(outputPath + "/src/main/java/org/openapitools/model/User.java")) + .fileContains("@JsonProperty(value = \"id\", access = JsonProperty.Access.READ_ONLY)") + .fileContains("@JsonProperty(value = \"createdAt\", access = JsonProperty.Access.READ_ONLY)") + .fileContains("@JsonProperty(\"username\")") + .fileContains("@JsonProperty(\"email\")"); + } + } diff --git a/modules/openapi-generator/src/test/resources/3_0/readonly-properties-test.yaml b/modules/openapi-generator/src/test/resources/3_0/readonly-properties-test.yaml new file mode 100644 index 000000000000..deaff090a996 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/readonly-properties-test.yaml @@ -0,0 +1,40 @@ +openapi: 3.0.0 +info: + title: ReadOnly Properties Test + version: 1.0.0 +paths: + /users: + get: + operationId: getUsers + responses: + '200': + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/User' + +components: + schemas: + User: + type: object + properties: + id: + type: string + description: Unique identifier + readOnly: true + createdAt: + type: string + format: date-time + description: Creation timestamp + readOnly: true + username: + type: string + description: User's login name + email: + type: string + format: email + description: User's email address + required: + - username + - email diff --git a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java index 0709304244e4..e0ab5577e807 100644 --- a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java +++ b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java @@ -40,12 +40,12 @@ public HasOnlyReadOnlyDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } @@ -60,12 +60,12 @@ public HasOnlyReadOnlyDto foo(@Nullable String foo) { * @return foo */ - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public @Nullable String getFoo() { return foo; } - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public void setFoo(@Nullable String foo) { this.foo = foo; } diff --git a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/NameDto.java b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/NameDto.java index 10b3d0d53088..ac3582ad9bbb 100644 --- a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/NameDto.java +++ b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/NameDto.java @@ -70,12 +70,12 @@ public NameDto snakeCase(@Nullable Integer snakeCase) { * @return snakeCase */ - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer getSnakeCase() { return snakeCase; } - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public void setSnakeCase(@Nullable Integer snakeCase) { this.snakeCase = snakeCase; } @@ -110,12 +110,12 @@ public NameDto _123number(@Nullable Integer _123number) { * @return _123number */ - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer get123number() { return _123number; } - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public void set123number(@Nullable Integer _123number) { this._123number = _123number; } diff --git a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java index cc5a8a3c752a..5b8b6d486494 100644 --- a/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java +++ b/samples/client/petstore/spring-http-interface-bean-validation/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java @@ -40,12 +40,12 @@ public ReadOnlyFirstDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } diff --git a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java index 8869a6ff28eb..8dbb938bda7e 100644 --- a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java +++ b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java @@ -39,12 +39,12 @@ public HasOnlyReadOnlyDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } @@ -59,12 +59,12 @@ public HasOnlyReadOnlyDto foo(@Nullable String foo) { * @return foo */ - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public @Nullable String getFoo() { return foo; } - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public void setFoo(@Nullable String foo) { this.foo = foo; } diff --git a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/NameDto.java b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/NameDto.java index 5fe3fc2e6843..ee70e16d6945 100644 --- a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/NameDto.java +++ b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/NameDto.java @@ -69,12 +69,12 @@ public NameDto snakeCase(@Nullable Integer snakeCase) { * @return snakeCase */ - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer getSnakeCase() { return snakeCase; } - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public void setSnakeCase(@Nullable Integer snakeCase) { this.snakeCase = snakeCase; } @@ -109,12 +109,12 @@ public NameDto _123number(@Nullable Integer _123number) { * @return _123number */ - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer get123number() { return _123number; } - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public void set123number(@Nullable Integer _123number) { this._123number = _123number; } diff --git a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java index 15d5a3f3fec5..1ffdc2e8e147 100644 --- a/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java +++ b/samples/client/petstore/spring-http-interface-noResponseEntity/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java @@ -39,12 +39,12 @@ public ReadOnlyFirstDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } diff --git a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java index 8869a6ff28eb..8dbb938bda7e 100644 --- a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java +++ b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java @@ -39,12 +39,12 @@ public HasOnlyReadOnlyDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } @@ -59,12 +59,12 @@ public HasOnlyReadOnlyDto foo(@Nullable String foo) { * @return foo */ - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public @Nullable String getFoo() { return foo; } - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public void setFoo(@Nullable String foo) { this.foo = foo; } diff --git a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/NameDto.java b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/NameDto.java index 5fe3fc2e6843..ee70e16d6945 100644 --- a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/NameDto.java +++ b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/NameDto.java @@ -69,12 +69,12 @@ public NameDto snakeCase(@Nullable Integer snakeCase) { * @return snakeCase */ - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer getSnakeCase() { return snakeCase; } - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public void setSnakeCase(@Nullable Integer snakeCase) { this.snakeCase = snakeCase; } @@ -109,12 +109,12 @@ public NameDto _123number(@Nullable Integer _123number) { * @return _123number */ - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer get123number() { return _123number; } - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public void set123number(@Nullable Integer _123number) { this._123number = _123number; } diff --git a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java index 15d5a3f3fec5..1ffdc2e8e147 100644 --- a/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java +++ b/samples/client/petstore/spring-http-interface/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java @@ -39,12 +39,12 @@ public ReadOnlyFirstDto bar(@Nullable String bar) { * @return bar */ - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } diff --git a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java index 07a5d3ffc719..d54805946c43 100644 --- a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java +++ b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/HasOnlyReadOnlyDto.java @@ -42,12 +42,12 @@ public HasOnlyReadOnlyDto bar(@Nullable String bar) { */ @Schema(name = "bar", accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.NOT_REQUIRED) - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; } @@ -63,12 +63,12 @@ public HasOnlyReadOnlyDto foo(@Nullable String foo) { */ @Schema(name = "foo", accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.NOT_REQUIRED) - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public @Nullable String getFoo() { return foo; } - @JsonProperty("foo") + @JsonProperty(value = "foo", access = JsonProperty.Access.READ_ONLY) public void setFoo(@Nullable String foo) { this.foo = foo; } diff --git a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/NameDto.java b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/NameDto.java index f10f345f82ea..7267c12fe764 100644 --- a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/NameDto.java +++ b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/NameDto.java @@ -81,12 +81,12 @@ public NameDto snakeCase(@Nullable Integer snakeCase) { */ @Schema(name = "snake_case", accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.NOT_REQUIRED) - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer getSnakeCase() { return snakeCase; } - @JsonProperty("snake_case") + @JsonProperty(value = "snake_case", access = JsonProperty.Access.READ_ONLY) public void setSnakeCase(@Nullable Integer snakeCase) { this.snakeCase = snakeCase; } @@ -123,12 +123,12 @@ public NameDto _123Number(@Nullable Integer _123Number) { */ @Schema(name = "123Number", accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.NOT_REQUIRED) - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public @Nullable Integer get123Number() { return _123Number; } - @JsonProperty("123Number") + @JsonProperty(value = "123Number", access = JsonProperty.Access.READ_ONLY) public void set123Number(@Nullable Integer _123Number) { this._123Number = _123Number; } diff --git a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java index 8a1e44fbadc0..47bf064ba590 100644 --- a/samples/server/petstore/springboot/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java +++ b/samples/server/petstore/springboot/src/main/java/org/openapitools/model/ReadOnlyFirstDto.java @@ -42,12 +42,12 @@ public ReadOnlyFirstDto bar(@Nullable String bar) { */ @Schema(name = "bar", accessMode = Schema.AccessMode.READ_ONLY, requiredMode = Schema.RequiredMode.NOT_REQUIRED) - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public @Nullable String getBar() { return bar; } - @JsonProperty("bar") + @JsonProperty(value = "bar", access = JsonProperty.Access.READ_ONLY) public void setBar(@Nullable String bar) { this.bar = bar; }