From 696eac623af710900d9dddaf4fed96ab965e7e1e Mon Sep 17 00:00:00 2001 From: Yurii Titov Date: Tue, 3 Mar 2026 11:36:33 +0100 Subject: [PATCH 1/5] feat: enable custom not null validation for items inside collection --- .../src/main/templates/boat-spring/beanValidationCore.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache b/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache index 7faf96bc9..1de563a6f 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}}@jakarta.validation.constraints.NotNull{{/vendorExtensions.x-not-null}} {{#pattern}}{{^isByteArray}}@Pattern(regexp = "{{{pattern}}}") {{/isByteArray}}{{/pattern}}{{! minLength && maxLength set }}{{#minLength}}{{#maxLength}}@Size(min = {{minLength}}, max = {{maxLength}}) {{/maxLength}}{{/minLength}}{{! From d620077700a55f4b594c1de2d8fbcebc8573f4d7 Mon Sep 17 00:00:00 2001 From: Yurii Titov Date: Tue, 3 Mar 2026 17:23:18 +0100 Subject: [PATCH 2/5] fix: add test cases --- .../templates/boat-spring/beanValidationCore.mustache | 2 +- .../test/resources/boat-spring/paths/array-types.yaml | 9 +++++++++ .../test/resources/boat-spring/paths/map-types.yaml | 9 +++++++++ .../test/resources/boat-spring/paths/set-types.yaml | 10 ++++++++++ .../test/resources/boat-spring/paths/simple-types.yaml | 10 ++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache b/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache index 1de563a6f..af85b9dd3 100644 --- a/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache +++ b/boat-scaffold/src/main/templates/boat-spring/beanValidationCore.mustache @@ -1,4 +1,4 @@ -{{#vendorExtensions.x-not-null}}@jakarta.validation.constraints.NotNull{{/vendorExtensions.x-not-null}} +{{#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/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 From c3fc5a80dd8a46cb31acc36a4be0106c4dca6a19 Mon Sep 17 00:00:00 2001 From: Yurii Titov Date: Thu, 5 Mar 2026 09:49:59 +0100 Subject: [PATCH 3/5] chore: change README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index eebed2a8a..3abbaa2f4 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ It currently consists of # Release Notes BOAT is still under development and subject to change. +## 0.17.76 +* 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.75 * Fixed duplicate serialization of the discriminator property in Jackson-based Java models by removing allowGetters = true from the @JsonIgnoreProperties annotation. From 94fbc328de984e5fccd524555375b2a86e0b5edf Mon Sep 17 00:00:00 2001 From: Yurii Titov Date: Thu, 5 Mar 2026 11:27:29 +0100 Subject: [PATCH 4/5] test: add checking if type level @NotNull validation is present --- .../java/BoatSpringTemplatesTests.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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 From d6ab678e1dfb1664daa3e7a5a88585233e39e8a1 Mon Sep 17 00:00:00 2001 From: Yurii Titov Date: Thu, 5 Mar 2026 14:54:31 +0100 Subject: [PATCH 5/5] chore: do changes in one version --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 3abbaa2f4..5fe9e74ec 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,9 @@ It currently consists of # Release Notes BOAT is still under development and subject to change. -## 0.17.76 -* 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.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.