diff --git a/docs/generators/java-camel.md b/docs/generators/java-camel.md index ec307b1f510..460d3ce49e8 100644 --- a/docs/generators/java-camel.md +++ b/docs/generators/java-camel.md @@ -120,6 +120,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |x-field-extra-annotation|List of custom annotations to be added to property|FIELD|null |x-spring-paginated|Add org.springframework.data.domain.Pageable to controller method. Can be used to handle page & size query parameters|OPERATION|false |x-version-param|Marker property that tells that this parameter would be used for endpoint versioning. Applicable for headers & query params. true/false|OPERATION_PARAMETER|null +|x-pattern-message|Add this property whenever you need to customize the invalidation error message for the regex pattern of a variable|FIELD|null ## IMPORT MAPPING diff --git a/docs/generators/spring.md b/docs/generators/spring.md index ce85c06de3c..4eaa8017e78 100644 --- a/docs/generators/spring.md +++ b/docs/generators/spring.md @@ -113,6 +113,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl |x-field-extra-annotation|List of custom annotations to be added to property|FIELD|null |x-spring-paginated|Add org.springframework.data.domain.Pageable to controller method. Can be used to handle page & size query parameters|OPERATION|false |x-version-param|Marker property that tells that this parameter would be used for endpoint versioning. Applicable for headers & query params. true/false|OPERATION_PARAMETER|null +|x-pattern-message|Add this property whenever you need to customize the invalidation error message for the regex pattern of a variable|FIELD|null ## IMPORT MAPPING diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java index f32cf01a8be..77b1b834166 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/VendorExtension.java @@ -16,6 +16,7 @@ public enum VendorExtension { X_CLASS_EXTRA_ANNOTATION("x-class-extra-annotation", ExtensionLevel.MODEL, "List of custom annotations to be added to model", null), X_FIELD_EXTRA_ANNOTATION("x-field-extra-annotation", ExtensionLevel.FIELD, "List of custom annotations to be added to property", null), X_VERSION_PARAM("x-version-param", ExtensionLevel.OPERATION_PARAMETER, "Marker property that tells that this parameter would be used for endpoint versioning. Applicable for headers & query params. true/false", null), + X_PATTERN_MESSAGE("x-pattern-message", ExtensionLevel.FIELD, "Add this property whenever you need to customize the invalidation error message for the regex pattern of a variable", null), ; private final String name; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java index 5c72c14d266..bdedac8a0bd 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java @@ -1255,6 +1255,7 @@ public class SpringCodegen extends AbstractJavaCodegen List extensions = super.getSupportedVendorExtensions(); extensions.add(VendorExtension.X_SPRING_PAGINATED); extensions.add(VendorExtension.X_VERSION_PARAM); + extensions.add(VendorExtension.X_PATTERN_MESSAGE); return extensions; } diff --git a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache index 7ebfccafca5..25138626ce7 100644 --- a/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache +++ b/modules/openapi-generator/src/main/resources/JavaSpring/beanValidationCore.mustache @@ -1,4 +1,4 @@ -{{#pattern}}{{^isByteArray}}@Pattern(regexp = "{{{pattern}}}") {{/isByteArray}}{{/pattern}}{{! +{{#pattern}}{{^isByteArray}}@Pattern(regexp = "{{{pattern}}}"{{#vendorExtensions.x-pattern-message}}, message="{{vendorExtensions.x-pattern-message}}"{{/vendorExtensions.x-pattern-message}}) {{/isByteArray}}{{/pattern}}{{! minLength && maxLength set }}{{#minLength}}{{#maxLength}}@Size(min = {{minLength}}, max = {{maxLength}}) {{/maxLength}}{{/minLength}}{{! minLength set, maxLength not 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 f00ac3e293a..5e96027a229 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 @@ -2514,4 +2514,44 @@ public class SpringCodegenTest { .doesNotContainsWithName("RestController"); } + @Test + public void testXPatternMessage_issue5857() throws IOException { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/2_0/issue5857.yaml"); + final SpringCodegen codegen = new SpringCodegen(); + codegen.setOpenAPI(openAPI); + codegen.setOutputDir(output.getAbsolutePath()); + + codegen.additionalProperties().put(SpringCodegen.DATE_LIBRARY, "java8-localdatetime"); + codegen.additionalProperties().put(INTERFACE_ONLY, "true"); + codegen.additionalProperties().put(USE_RESPONSE_ENTITY, "false"); + codegen.additionalProperties().put(DELEGATE_PATTERN, "true"); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + + Map files = generator.opts(input).generate().stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + + JavaFileAssert javaFileAssert = JavaFileAssert.assertThat(files.get("ObjTest.java")); + javaFileAssert + .assertMethod("getField2") + .assertMethodAnnotations() + .containsWithNameAndAttributes("Pattern", ImmutableMap.of( + "regexp", "\"\\\\w\"", + "message", "\"Only letters, numbers and underscore\"" + )); + javaFileAssert + .assertMethod("getField3") + .assertMethodAnnotations() + .containsWithNameAndAttributes("Pattern", ImmutableMap.of( + "regexp", "\"\\\\w\"" + )); + } + } diff --git a/modules/openapi-generator/src/test/resources/2_0/issue5857.yaml b/modules/openapi-generator/src/test/resources/2_0/issue5857.yaml new file mode 100644 index 00000000000..ed32e65c79e --- /dev/null +++ b/modules/openapi-generator/src/test/resources/2_0/issue5857.yaml @@ -0,0 +1,45 @@ +swagger: '2.0' +info: + description: 'blah' + version: 1.0.0 + title: sample spec +host: fake.site.com +tags: + - name: Test +schemes: + - https +paths: + /test: + post: + summary: Post to test + description: '' + operationId: postToTest + consumes: + - application/json + produces: + - application/json + parameters: + - in: body + name: Obj to test + schema: + $ref: '#/definitions/ObjTest' + responses: + '201': + description: successful operation + schema: + $ref: '#/definitions/ObjTest' +definitions: + ObjTest: + description: A model to return + type: object + properties: + field1: + type: integer + format: int64 + field2: + type: string + pattern: "\\w" + x-pattern-message: "Only letters, numbers and underscore" + field3: + type: string + pattern: "\\w"