From f0fd94441f3ae9dc2d9709e85415cceaa303ce9f Mon Sep 17 00:00:00 2001 From: Reinhard-PTV <77726540+Reinhard-PTV@users.noreply.github.com> Date: Sat, 26 Feb 2022 03:58:06 +0100 Subject: [PATCH] Support validation for arrays for JavaJaxRS and a test to validate the fix (#11709) --- .../JavaJaxRS/spec/beanValidatedType.mustache | 1 + .../resources/JavaJaxRS/spec/pojo.mustache | 2 +- .../jaxrs/JavaJAXRSSpecServerCodegenTest.java | 30 +++++++++++++++-- .../3_0/deepobject-array-with-pattern.yaml | 33 +++++++++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 modules/openapi-generator/src/main/resources/JavaJaxRS/spec/beanValidatedType.mustache create mode 100644 modules/openapi-generator/src/test/resources/3_0/deepobject-array-with-pattern.yaml diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/beanValidatedType.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/beanValidatedType.mustache new file mode 100644 index 00000000000..8f2816b2c70 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/beanValidatedType.mustache @@ -0,0 +1 @@ +{{#isArray}}{{baseType}}<{{#items}}{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}}{{>beanValidatedType}}{{/items}}>{{/isArray}}{{^isArray}}{{{datatypeWithEnum}}}{{/isArray}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache index 4e9af1007bd..62f1137a488 100644 --- a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache @@ -45,7 +45,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; {{#vendorExtensions.x-extra-annotation}}{{{vendorExtensions.x-extra-annotation}}}{{/vendorExtensions.x-extra-annotation}}{{#useSwaggerAnnotations}} @ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}value = "{{{description}}}"){{/useSwaggerAnnotations}} @JsonProperty("{{baseName}}") -{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}} public {{{datatypeWithEnum}}} {{getter}}() { +{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}} public {{>beanValidatedType}} {{getter}}() { return {{name}}; } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java index 78e24b17f85..681f6360c9c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java @@ -6,11 +6,9 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.core.models.ParseOptions; - import org.openapitools.codegen.*; import org.openapitools.codegen.config.CodegenConfigurator; import org.openapitools.codegen.languages.AbstractJavaJAXRSServerCodegen; -import org.openapitools.codegen.languages.JavaClientCodegen; import org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen; import org.openapitools.codegen.languages.features.CXFServerFeatures; import org.testng.Assert; @@ -30,8 +28,8 @@ import static org.openapitools.codegen.TestUtils.assertFileContains; import static org.openapitools.codegen.TestUtils.validateJavaSourceFiles; import static org.openapitools.codegen.languages.AbstractJavaJAXRSServerCodegen.USE_TAGS; import static org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen.INTERFACE_ONLY; -import static org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen.SUPPORT_ASYNC; import static org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen.RETURN_RESPONSE; +import static org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen.SUPPORT_ASYNC; import static org.testng.Assert.assertTrue; /** @@ -586,4 +584,30 @@ public class JavaJAXRSSpecServerCodegenTest extends JavaJaxrsBaseTest { "CompletionStage pingGetInteger" //Support primitive types response ); } + + @Test + public void generateDeepObjectArrayWithPattern() 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/deepobject-array-with-pattern.yaml", null, new ParseOptions()).getOpenAPI(); + codegen.setOutputDir(output.getAbsolutePath()); + + codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); + + ClientOptInput input = new ClientOptInput() + .openAPI(openAPI) + .config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(input).generate(); + + //Then the java files are compilable + validateJavaSourceFiles(files); + + TestUtils.ensureContainsFile(files, output, "src/gen/java/org/openapitools/model/Options.java"); + TestUtils.assertFileContains(output.toPath().resolve("src/gen/java/org/openapitools/model/Options.java"), "List< @Pattern(regexp=\"^[A-Z].*\")String> getA()"); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/deepobject-array-with-pattern.yaml b/modules/openapi-generator/src/test/resources/3_0/deepobject-array-with-pattern.yaml new file mode 100644 index 00000000000..a6a4b86eec9 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/deepobject-array-with-pattern.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.3 +info: + title: deepobject-array-with-pattern-test + version: 1.0.0 +paths: + /test: + get: + operationId: test + parameters: + - name: options + in: query + required: false + style: deepObject + schema: + $ref: '#/components/schemas/Options' + explode: true + responses: + '200': + description: OK + content: + text/plain: + schema: + type: string +components: + schemas: + Options: + type: object + properties: + a: + type: array + items: + type: string + pattern: '^[A-Z].*'