From 07c66ea0f6b3a0b2e791627bfd857cff69a05698 Mon Sep 17 00:00:00 2001 From: Anastasiia Urupa Date: Wed, 5 Mar 2025 12:19:23 +0200 Subject: [PATCH 1/2] Fix: add missing @Size validations when request body is a collection --- .../boat-spring/beanValidationBodyParams.mustache | 1 + .../src/main/templates/boat-spring/bodyParams.mustache | 2 +- .../oss/codegen/java/BoatSpringCodeGenTests.java | 10 ++++++++++ .../src/test/resources/boat-spring/openapi.yaml | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 boat-scaffold/src/main/templates/boat-spring/beanValidationBodyParams.mustache diff --git a/boat-scaffold/src/main/templates/boat-spring/beanValidationBodyParams.mustache b/boat-scaffold/src/main/templates/boat-spring/beanValidationBodyParams.mustache new file mode 100644 index 000000000..6f4e70f06 --- /dev/null +++ b/boat-scaffold/src/main/templates/boat-spring/beanValidationBodyParams.mustache @@ -0,0 +1 @@ +{{^useOptional}}{{>beanValidationCore}}{{/useOptional}}{{#useOptional}}{{#required}}{{>beanValidationCore}}{{/required}}{{/useOptional}} \ No newline at end of file diff --git a/boat-scaffold/src/main/templates/boat-spring/bodyParams.mustache b/boat-scaffold/src/main/templates/boat-spring/bodyParams.mustache index b582385da..42ca93d70 100644 --- a/boat-scaffold/src/main/templates/boat-spring/bodyParams.mustache +++ b/boat-scaffold/src/main/templates/boat-spring/bodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}{{>paramDoc}}{{#useBeanValidation}} @Valid{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isArray}}Mono<{{{dataType}}}>{{/isArray}}{{#isArray}}Flux<{{{baseType}}}>{{/isArray}}{{/reactive}} {{paramName}}{{#useBeanValidation}}{{#addBindingResult}}, BindingResult bindingResult{{/addBindingResult}}{{/useBeanValidation}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{>paramDoc}}{{#useBeanValidation}} @Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{^reactive}}{{{dataType}}}{{/reactive}}{{#reactive}}{{^isArray}}Mono<{{{dataType}}}>{{/isArray}}{{#isArray}}Flux<{{{baseType}}}>{{/isArray}}{{/reactive}} {{paramName}}{{#useBeanValidation}}{{#addBindingResult}}, BindingResult bindingResult{{/addBindingResult}}{{/useBeanValidation}}{{/isBodyParam}} \ No newline at end of file diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java index 5982c9f50..a81249995 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java @@ -22,6 +22,7 @@ import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; +import com.github.javaparser.ast.expr.AnnotationExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.Type; @@ -216,6 +217,15 @@ void shouldGenerateValidations(boolean useLombok, boolean bigDecimalsAsStrings) assertHasCollectionParamWithType(getPaymentsMethod, "status", "List", "String"); assertHasCollectionParamWithType(getPaymentsMethod, "headerParams", "List", "String"); + MethodDeclaration createPaymentsMethod = StaticJavaParser.parse(paymentsApiFile) + .findAll(MethodDeclaration.class) + .stream() + .filter(it -> "createPayments".equals(it.getName().toString())) + .findFirst().orElseThrow(); + AnnotationExpr sizeAnnotation = createPaymentsMethod.getParameterByName("multiLinePaymentRequest").orElseThrow() + .getAnnotationByName("Size").orElseThrow(); + assertEquals("@Size(min = 1, max = 55)", sizeAnnotation.toString()); + File paymentRequestLine = files.stream().filter(file -> file.getName().equals("PaymentRequestLine.java")) .findFirst() .get(); diff --git a/boat-scaffold/src/test/resources/boat-spring/openapi.yaml b/boat-scaffold/src/test/resources/boat-spring/openapi.yaml index b083c78cb..e88986bc7 100644 --- a/boat-scaffold/src/test/resources/boat-spring/openapi.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/openapi.yaml @@ -100,6 +100,8 @@ paths: application/json: schema: type: array + maxItems: 55 + minItems: 1 items: $ref: '#/components/schemas/MultiLinePaymentRequest' responses: From d31dedcc02713994f84dcc1f36c58601b722ac69 Mon Sep 17 00:00:00 2001 From: Anastasiia Urupa Date: Wed, 5 Mar 2025 12:43:24 +0200 Subject: [PATCH 2/2] Fix: do not replace \r\n pattern for fields --- .../backbase/oss/codegen/java/BoatSpringCodeGen.java | 1 - .../oss/codegen/java/BoatSpringCodeGenTests.java | 10 ++++++++++ .../src/test/resources/boat-spring/openapi.yaml | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java index 827cd98ca..86309d269 100644 --- a/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java +++ b/boat-scaffold/src/main/java/com/backbase/oss/codegen/java/BoatSpringCodeGen.java @@ -124,7 +124,6 @@ public void execute(Fragment frag, Writer out) throws IOException { return; } String formatted = text - .replace("\\n", SINGLE_SPACE) .replaceAll(WHITESPACE_REGEX, SINGLE_SPACE) .replaceAll("\\< ", "<") .replaceAll(" >", ">") diff --git a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java index a81249995..779a7f914 100644 --- a/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java +++ b/boat-scaffold/src/test/java/com/backbase/oss/codegen/java/BoatSpringCodeGenTests.java @@ -259,6 +259,7 @@ void shouldGenerateValidations(boolean useLombok, boolean bigDecimalsAsStrings) assertFieldValueAssignment( multiLinePaymentRequestUnit, "arrangementIds", "new ArrayList<>()"); assertFieldAnnotation(multiLinePaymentRequestUnit, "uniqueLines", "NotNull"); + assertFieldAnnotation(multiLinePaymentRequestUnit, "name", "Pattern", "@Pattern(regexp = \"^[^\\\\r\\\\n]{1,64}$\")"); assertFieldValueAssignment( multiLinePaymentRequestUnit, "uniqueArrangementIds", null); @@ -450,6 +451,15 @@ private static void assertFieldAnnotation( fieldDeclaration.getAnnotationByName(annotationName).isPresent(), is(true)); } + private static void assertFieldAnnotation( + CompilationUnit unit, String fieldName, String annotationName, String value) throws FileNotFoundException { + FieldDeclaration fieldDeclaration = findFieldDeclaration(unit, fieldName); + AnnotationExpr annotation = fieldDeclaration.getAnnotationByName(annotationName) + .orElseThrow(() -> new AssertionError( + "Expect annotation to be present on field: " + annotationName + " " + fieldName)); + assertThat(annotation.toString(), equalTo(value)); + } + private static void assertFieldValueAssignment( CompilationUnit unit, String fieldName, String valueAssignment) throws FileNotFoundException { FieldDeclaration fieldDeclaration = findFieldDeclaration(unit, fieldName); diff --git a/boat-scaffold/src/test/resources/boat-spring/openapi.yaml b/boat-scaffold/src/test/resources/boat-spring/openapi.yaml index e88986bc7..af5369986 100644 --- a/boat-scaffold/src/test/resources/boat-spring/openapi.yaml +++ b/boat-scaffold/src/test/resources/boat-spring/openapi.yaml @@ -315,6 +315,7 @@ components: description: Request name minLength: 3 maxLength: 251 + pattern: "^[^\\r\\n]{1,64}$" amountNumberAsString: description: The amount string in number format type: string