diff --git a/README.md b/README.md index eebed2a8a..5fe9e74ec 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ BOAT is still under development and subject to change. ## 0.17.75 * Fixed duplicate serialization of the discriminator property in Jackson-based Java models by removing allowGetters = true from the @JsonIgnoreProperties annotation. +* In Spring generator added support for type-level validation in collections via the `x-not-null` vendor extension to allow `@NotNull` annotations on generic type arguments. ## 0.17.74 * Swift5: Removed deprecated initializer from model objects. The initializer is now internal and only accessible through the Builder pattern, preventing breaking code from deprecation warnings. diff --git a/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache b/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache index 7faf96bc9..af85b9dd3 100644 --- a/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache +++ b/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache @@ -1,3 +1,4 @@ +{{#vendorExtensions.x-not-null}}@NotNull{{/vendorExtensions.x-not-null}} {{#pattern}}{{^isByteArray}}@Pattern(regexp = "{{{pattern}}}") {{/isByteArray}}{{/pattern}}{{! minLength && maxLength set }}{{#minLength}}{{#maxLength}}@Size(min = {{minLength}}, max = {{maxLength}}) {{/maxLength}}{{/minLength}}{{! diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringTemplatesTests.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringTemplatesTests.java index 36c00f407..eec51db26 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringTemplatesTests.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringTemplatesTests.java @@ -192,13 +192,25 @@ void generate(Combination param) { @Check void useBeanValidation() { assertThat(findPattern("/api/.+\\.java$", "@Valid"), - equalTo(this.param.useBeanValidation||this.param.addBindingResult)); + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); assertThat(findPattern("/model/.+\\.java$", "@Valid"), - equalTo(this.param.useBeanValidation||this.param.addBindingResult)); + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); assertThat(findPattern("/model/MultiLinePaymentRequest.*\\.java$", "List<@Pattern\\(regexp"), - equalTo(this.param.useBeanValidation||this.param.addBindingResult)); + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); assertThat(findPattern("/model/MultiLinePaymentRequest.*\\.java$", "Map\\s+qParamsNotNull"), + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); + assertThat(findPattern("/api/SetTypesApi\\.java$", "Set\\s*<@NotNull.*>\\s+qParamsNotNull"), + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); + assertThat(findPattern("/api/SimpleTypesApi\\.java$", "Set\\s*<@NotNull.*>\\s+qParamsNotNull"), + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); + assertThat(findPattern("/api/MapTypesApi\\.java$", "List<@NotNull.*>\\s+qParamsNotNull"), + equalTo(this.param.useBeanValidation || this.param.addBindingResult)); } @Check diff --git a/boat-scaffold/src/test/resources/boat-spring/paths/array-types.yaml b/boat-scaffold/src/test/resources/boat-spring/paths/array-types.yaml index 54f86caef..3d00d823e 100644 --- a/boat-scaffold/src/test/resources/boat-spring/paths/array-types.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/paths/array-types.yaml @@ -86,6 +86,15 @@ get: minLength: 1 maxLength: 36 pattern: '^[A-Z]+$' + - name: q-params-not-null + in: query + required: false + schema: + type: array + items: + type: string + x-not-null: true + pattern: '^[A-Z]+$' - name: q-params-set in: query required: false diff --git a/boat-scaffold/src/test/resources/boat-spring/paths/map-types.yaml b/boat-scaffold/src/test/resources/boat-spring/paths/map-types.yaml index 482e7d330..f5067a227 100644 --- a/boat-scaffold/src/test/resources/boat-spring/paths/map-types.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/paths/map-types.yaml @@ -86,6 +86,15 @@ get: minLength: 1 maxLength: 36 pattern: '^[A-Z]+$' + - name: q-params-not-null + in: query + required: false + schema: + type: array + items: + type: string + x-not-null: true + pattern: '^[A-Z]+$' - name: q-params-set in: query required: false diff --git a/boat-scaffold/src/test/resources/boat-spring/paths/set-types.yaml b/boat-scaffold/src/test/resources/boat-spring/paths/set-types.yaml index e80d7c304..d17ced230 100644 --- a/boat-scaffold/src/test/resources/boat-spring/paths/set-types.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/paths/set-types.yaml @@ -97,6 +97,16 @@ get: minLength: 1 maxLength: 36 pattern: '^[A-Z]+$' + - name: q-params-not-null + in: query + required: false + schema: + type: array + uniqueItems: true + items: + type: string + x-not-null: true + pattern: '^[A-Z]+$' - name: q-params-set-req in: query required: true diff --git a/boat-scaffold/src/test/resources/boat-spring/paths/simple-types.yaml b/boat-scaffold/src/test/resources/boat-spring/paths/simple-types.yaml index f347352b0..b3f101348 100644 --- a/boat-scaffold/src/test/resources/boat-spring/paths/simple-types.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/paths/simple-types.yaml @@ -86,6 +86,16 @@ get: minLength: 1 maxLength: 36 pattern: '^[A-Z]+$' + - name: q-params-not-null + in: query + required: false + schema: + type: array + uniqueItems: true + items: + type: string + x-not-null: true + pattern: '^[A-Z]+$' - name: q-params-set in: query required: false