diff --git a/modules/openapi-generator/src/main/resources/Java/beanValidation.mustache b/modules/openapi-generator/src/main/resources/Java/beanValidation.mustache index 1bc9afa8f68..47f7109e5bc 100644 --- a/modules/openapi-generator/src/main/resources/Java/beanValidation.mustache +++ b/modules/openapi-generator/src/main/resources/Java/beanValidation.mustache @@ -1,5 +1,7 @@ {{#required}} +{{^isReadOnly}} @NotNull +{{/isReadOnly}} {{/required}} {{#isContainer}} {{^isPrimitiveType}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/beanValidation.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/beanValidation.mustache index c8c6946fef6..f8724b24429 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/beanValidation.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/microprofile/beanValidation.mustache @@ -1,4 +1,6 @@ {{#required}} +{{^isReadOnly}} @NotNull +{{/isReadOnly}} {{/required}} {{>beanValidationCore}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidation.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidation.mustache index 34c7581d5d4..e427a43a0ac 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidation.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidation.mustache @@ -1 +1 @@ -{{#required}}@NotNull {{/required}}{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}@Valid {{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}@Valid {{/isPrimitiveType}}{{/isContainer}}{{>beanValidationCore}} \ No newline at end of file +{{#required}}{{^isReadOnly}}@NotNull {{/isReadOnly}}{{/required}}{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}}@Valid {{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{^isContainer}}{{^isPrimitiveType}}@Valid {{/isPrimitiveType}}{{/isContainer}}{{>beanValidationCore}} \ No newline at end of file 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 2c62cecc8c3..f467ee4af5e 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 @@ -793,11 +793,73 @@ public class SpringCodegenTest { assertEquals(desFile, DESTINATIONFILE); } } - if(!flag){ + if (!flag) { fail("OpenAPIDocumentationConfig.java not generated"); } } + @Test + public void shouldAddNotNullOnRequiredAttributes() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/spring/issue_5026-b.yaml"); + final SpringCodegen codegen = new SpringCodegen(); + codegen.setOpenAPI(openAPI); + 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.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + + generator.opts(input).generate(); + + assertFileContains(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java"), "status"); + assertFileContains(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java"), "@NotNull"); + Files.readAllLines(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java")).forEach(System.out::println); + + } + + @Test + public void shouldNotAddNotNullOnReadOnlyAttributes() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/spring/issue_5026.yaml"); + final SpringCodegen codegen = new SpringCodegen(); + codegen.setOpenAPI(openAPI); + 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.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); + + generator.opts(input).generate(); + + assertFileContains(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java"), "status"); + assertFileNotContains(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java"), "@NotNull"); + Files.readAllLines(Paths.get(outputPath + "/src/main/java/org/openapitools/model/Dummy.java")).forEach(System.out::println); + + } + @Test public void testTypeMappings() { final SpringCodegen codegen = new SpringCodegen(); diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026-b.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026-b.yaml new file mode 100644 index 00000000000..1255e667cc2 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026-b.yaml @@ -0,0 +1,34 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: reactive-spring-boot-request-body-issue +tags: + - name: ReactiveSpringBootRequestBodyIssue +paths: + /some/dummy/endpoint: + post: + tags: + - ReactiveSpringBootRequestBodyIssue + requestBody: + description: request + content: + application/json: + schema: + $ref: '#/components/schemas/Dummy' + required: true + responses: + 200: + description: Successfully created reverse listings for retail + content: + application/json: + schema: + $ref: '#/components/schemas/Dummy' +components: + schemas: + Dummy: + required: + - status + type: object + properties: + status: + type: string diff --git a/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026.yaml b/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026.yaml new file mode 100644 index 00000000000..2031488ea7a --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/spring/issue_5026.yaml @@ -0,0 +1,35 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: reactive-spring-boot-request-body-issue +tags: + - name: ReactiveSpringBootRequestBodyIssue +paths: + /some/dummy/endpoint: + post: + tags: + - ReactiveSpringBootRequestBodyIssue + requestBody: + description: request + content: + application/json: + schema: + $ref: '#/components/schemas/Dummy' + required: true + responses: + 200: + description: Successfully created reverse listings for retail + content: + application/json: + schema: + $ref: '#/components/schemas/Dummy' +components: + schemas: + Dummy: + required: + - status + type: object + properties: + status: + type: string + readOnly: true