Skip to content

Commit ac0c08f

Browse files
committed
[Spring] Bean validation for headers
1 parent 7ff47dc commit ac0c08f

File tree

23 files changed

+156
-21
lines changed
  • modules/openapi-generator/src
  • samples
    • client/petstore/spring-cloud-date-time/src/main/java/org/openapitools/api
    • openapi3
      • client/petstore
        • spring-cloud-date-time/src/main/java/org/openapitools/api
        • spring-cloud-oas3-fakeapi/src/main/java/org/openapitools/api
      • server/petstore
        • springboot-beanvalidation-no-nullable/src/main/java/org/openapitools/api
        • springboot-delegate/src/main/java/org/openapitools/api
        • springboot-reactive/src/main/java/org/openapitools/api
        • springboot-useoptional/src/main/java/org/openapitools/api
    • server/petstore
      • spring-boot-defaultInterface-unhandledException/src/main/java/org/openapitools/api
      • springboot-beanvalidation-no-nullable/src/main/java/org/openapitools/api
      • springboot-beanvalidation/src/main/java/org/openapitools/api
      • springboot-delegate-j8/src/main/java/org/openapitools/api
      • springboot-delegate/src/main/java/org/openapitools/api
      • springboot-reactive/src/main/java/org/openapitools/api
      • springboot-spring-pageable-delegatePattern-without-j8/src/main/java/org/openapitools/api
      • springboot-spring-pageable-delegatePattern/src/main/java/org/openapitools/api
      • springboot-spring-pageable-without-j8/src/main/java/org/openapitools/api
      • springboot-spring-pageable/src/main/java/org/openapitools/api
      • springboot-useoptional/src/main/java/org/openapitools/api
      • springboot-virtualan/src/main/java/org/openapitools/virtualan/api
      • springboot/src/main/java/org/openapitools/api

23 files changed

+156
-21
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isHeaderParam}}{{>paramDoc}} @RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}){{>dateTimeParam}} {{>optionalDataType}} {{paramName}}{{/isHeaderParam}}
1+
{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{>paramDoc}} @RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}){{>dateTimeParam}} {{>optionalDataType}} {{paramName}}{{/isHeaderParam}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.openapitools.codegen.TestUtils;
5858
import org.openapitools.codegen.languages.AbstractJavaCodegen;
5959
import org.openapitools.codegen.languages.SpringCodegen;
60+
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
6061
import org.openapitools.codegen.languages.features.CXFServerFeatures;
6162
import org.openapitools.codegen.languages.features.DocumentationProviderFeatures;
6263
import org.testng.Assert;
@@ -1499,4 +1500,47 @@ public void shouldGenerateDiscriminatorFromAllOfWhenUsingLegacyDiscriminatorBeha
14991500
"})";
15001501
assertFileContains(Paths.get(output.getAbsolutePath() + "/src/main/java/org/openapitools/model/Pet.java"), jsonTypeInfo, jsonSubType);
15011502
}
1503+
1504+
@Test
1505+
public void shouldGenerateBeanValidationOnHeaderParams() throws IOException {
1506+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1507+
output.deleteOnExit();
1508+
1509+
OpenAPI openAPI = new OpenAPIParser()
1510+
.readLocation("src/test/resources/bugs/issue_7125.json", null, new ParseOptions()).getOpenAPI();
1511+
SpringCodegen codegen = new SpringCodegen();
1512+
codegen.setLibrary(SPRING_BOOT);
1513+
codegen.setOutputDir(output.getAbsolutePath());
1514+
codegen.additionalProperties().put(SpringCodegen.USE_TAGS, "true");
1515+
codegen.additionalProperties().put(BeanValidationFeatures.USE_BEANVALIDATION, "true");
1516+
1517+
ClientOptInput input = new ClientOptInput()
1518+
.openAPI(openAPI)
1519+
.config(codegen);
1520+
1521+
DefaultGenerator generator = new DefaultGenerator();
1522+
Map<String, File> files = generator.opts(input).generate().stream()
1523+
.collect(Collectors.toMap(File::getName, Function.identity()));
1524+
1525+
JavaFileAssert.assertThat(files.get("SomeMethodApi.java"))
1526+
.printFileContent()
1527+
.assertMethod("methodWithValidation")
1528+
.hasParameter("headerOne")
1529+
.assertParameterAnnotations()
1530+
.containsWithName("RequestHeader")
1531+
.containsWithName("NotNull")
1532+
.containsWithNameAndAttributes("Size", ImmutableMap.of(
1533+
"min", "1",
1534+
"max", "10"
1535+
))
1536+
.containsWithNameAndAttributes("Pattern", ImmutableMap.of("regexp", "\"\\\\d+\""))
1537+
.toParameter()
1538+
.toMethod()
1539+
.hasParameter("headerTwo")
1540+
.assertParameterAnnotations()
1541+
.containsWithName("RequestHeader")
1542+
.containsWithName("NotNull")
1543+
.containsWithNameAndAttributes("Min", ImmutableMap.of("value", "500"))
1544+
.containsWithNameAndAttributes("Max", ImmutableMap.of("value", "10000"));
1545+
}
15021546
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "title",
5+
"description": "description",
6+
"version": "1.0.0",
7+
"contact": {
8+
"name": "name",
9+
"url": "url",
10+
"email": "email.com"
11+
}
12+
},
13+
"paths": {
14+
"/someUrl/v1/smth": {
15+
"post": {
16+
"tags": [
17+
"someMethod"
18+
],
19+
"summary": "summary",
20+
"description": "description",
21+
"operationId": "methodWithValidation",
22+
"parameters": [
23+
{
24+
"$ref": "#/components/parameters/HeaderOne"
25+
},
26+
{
27+
"$ref": "#/components/parameters/HeaderTwo"
28+
}
29+
],
30+
"requestBody": {
31+
"description": "Request Body",
32+
"content": {
33+
"application/json": {
34+
"schema": {
35+
"$ref": "#/components/schemas/SomeBody"
36+
}
37+
}
38+
},
39+
"required": true
40+
},
41+
"responses": {
42+
"202": {
43+
"description": "success"
44+
}
45+
}
46+
}
47+
}
48+
},
49+
"components": {
50+
"schemas": {
51+
"SomeBody": {
52+
"type": "object",
53+
"required": [
54+
"id"
55+
],
56+
"properties": {
57+
"id": {
58+
"type": "string",
59+
"example": "123",
60+
"description": "description"
61+
}
62+
}
63+
}
64+
},
65+
"parameters": {
66+
"HeaderOne": {
67+
"name": "HeaderOne",
68+
"in": "header",
69+
"description": "description",
70+
"required": true,
71+
"schema": {
72+
"type": "string",
73+
"minLength": 1,
74+
"maxLength": 10,
75+
"pattern": "\\d+"
76+
}
77+
},
78+
"HeaderTwo": {
79+
"name": "HeaderTwo",
80+
"in": "header",
81+
"description": "description",
82+
"required": true,
83+
"schema": {
84+
"type": "integer",
85+
"minimum": 500,
86+
"maximum": 10000
87+
}
88+
}
89+
}
90+
}
91+
}

samples/client/petstore/spring-cloud-date-time/src/main/java/org/openapitools/api/DefaultApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public interface DefaultApi {
5454
ResponseEntity<Void> get(
5555
@ApiParam(value = "A date path parameter", required = true, defaultValue = "1972-01-01") @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
5656
@NotNull @ApiParam(value = "A date-time query parameter", required = true, defaultValue = "1973-12-19T03:39:57-08:00") @Valid @RequestParam(value = "dateTime", required = true, defaultValue = "1973-12-19T03:39:57-08:00") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime dateTime,
57-
@ApiParam(value = "A date header parameter", required = true, defaultValue = "1974-01-01") @RequestHeader(value = "X-Order-Date", required = true, defaultValue = "1974-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate xOrderDate,
57+
@NotNull @ApiParam(value = "A date header parameter", required = true, defaultValue = "1974-01-01") @RequestHeader(value = "X-Order-Date", required = true, defaultValue = "1974-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate xOrderDate,
5858
@ApiParam(value = "A date cookie parameter", defaultValue = "1975-01-01") @CookieValue(name = "loginDate", required = false, defaultValue = "1975-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate loginDate
5959
);
6060

samples/openapi3/client/petstore/spring-cloud-date-time/src/main/java/org/openapitools/api/DefaultApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public interface DefaultApi {
5959
ResponseEntity<Void> get(
6060
@Parameter(name = "date", description = "A date path parameter", required = true) @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
6161
@NotNull @Parameter(name = "dateTime", description = "A date-time query parameter", required = true) @Valid @RequestParam(value = "dateTime", required = true, defaultValue = "1973-12-19T03:39:57-08:00") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) OffsetDateTime dateTime,
62-
@Parameter(name = "X-Order-Date", description = "A date header parameter", required = true) @RequestHeader(value = "X-Order-Date", required = true, defaultValue = "1974-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate xOrderDate,
62+
@NotNull @Parameter(name = "X-Order-Date", description = "A date header parameter", required = true) @RequestHeader(value = "X-Order-Date", required = true, defaultValue = "1974-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate xOrderDate,
6363
@Parameter(name = "loginDate", description = "A date cookie parameter") @CookieValue(name = "loginDate", required = false, defaultValue = "1975-01-01") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate loginDate
6464
);
6565

samples/openapi3/client/petstore/spring-cloud-oas3-fakeapi/src/main/java/org/openapitools/api/FakeApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ ResponseEntity<Void> testEnumParameters(
373373
)
374374
ResponseEntity<Void> testGroupParameters(
375375
@NotNull @Parameter(name = "required_string_group", description = "Required String in group parameters", required = true) @Valid @RequestParam(value = "required_string_group", required = true) Integer requiredStringGroup,
376-
@Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
376+
@NotNull @Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
377377
@NotNull @Parameter(name = "required_int64_group", description = "Required Integer in group parameters", required = true) @Valid @RequestParam(value = "required_int64_group", required = true) Long requiredInt64Group,
378378
@Parameter(name = "string_group", description = "String in group parameters") @Valid @RequestParam(value = "string_group", required = false) Integer stringGroup,
379379
@Parameter(name = "boolean_group", description = "Boolean in group parameters") @RequestHeader(value = "boolean_group", required = false) Boolean booleanGroup,

samples/openapi3/server/petstore/springboot-beanvalidation-no-nullable/src/main/java/org/openapitools/api/FakeApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ default ResponseEntity<Void> testEnumParameters(
426426
)
427427
default ResponseEntity<Void> testGroupParameters(
428428
@NotNull @Parameter(name = "required_string_group", description = "Required String in group parameters", required = true) @Valid @RequestParam(value = "required_string_group", required = true) Integer requiredStringGroup,
429-
@Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
429+
@NotNull @Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
430430
@NotNull @Parameter(name = "required_int64_group", description = "Required Integer in group parameters", required = true) @Valid @RequestParam(value = "required_int64_group", required = true) Long requiredInt64Group,
431431
@Parameter(name = "string_group", description = "String in group parameters") @Valid @RequestParam(value = "string_group", required = false) Integer stringGroup,
432432
@Parameter(name = "boolean_group", description = "Boolean in group parameters") @RequestHeader(value = "boolean_group", required = false) Boolean booleanGroup,

samples/openapi3/server/petstore/springboot-delegate/src/main/java/org/openapitools/api/FakeApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ default ResponseEntity<Void> testEnumParameters(
394394
)
395395
default ResponseEntity<Void> testGroupParameters(
396396
@NotNull @Parameter(name = "required_string_group", description = "Required String in group parameters", required = true) @Valid @RequestParam(value = "required_string_group", required = true) Integer requiredStringGroup,
397-
@Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
397+
@NotNull @Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
398398
@NotNull @Parameter(name = "required_int64_group", description = "Required Integer in group parameters", required = true) @Valid @RequestParam(value = "required_int64_group", required = true) Long requiredInt64Group,
399399
@Parameter(name = "string_group", description = "String in group parameters") @Valid @RequestParam(value = "string_group", required = false) Integer stringGroup,
400400
@Parameter(name = "boolean_group", description = "Boolean in group parameters") @RequestHeader(value = "boolean_group", required = false) Boolean booleanGroup,

samples/openapi3/server/petstore/springboot-reactive/src/main/java/org/openapitools/api/FakeApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ default Mono<ResponseEntity<Void>> testEnumParameters(
408408
)
409409
default Mono<ResponseEntity<Void>> testGroupParameters(
410410
@NotNull @Parameter(name = "required_string_group", description = "Required String in group parameters", required = true) @Valid @RequestParam(value = "required_string_group", required = true) Integer requiredStringGroup,
411-
@Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
411+
@NotNull @Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
412412
@NotNull @Parameter(name = "required_int64_group", description = "Required Integer in group parameters", required = true) @Valid @RequestParam(value = "required_int64_group", required = true) Long requiredInt64Group,
413413
@Parameter(name = "string_group", description = "String in group parameters") @Valid @RequestParam(value = "string_group", required = false) Integer stringGroup,
414414
@Parameter(name = "boolean_group", description = "Boolean in group parameters") @RequestHeader(value = "boolean_group", required = false) Boolean booleanGroup,

samples/openapi3/server/petstore/springboot-useoptional/src/main/java/org/openapitools/api/FakeApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ default ResponseEntity<Void> testEnumParameters(
426426
)
427427
default ResponseEntity<Void> testGroupParameters(
428428
@NotNull @Parameter(name = "required_string_group", description = "Required String in group parameters", required = true) @Valid @RequestParam(value = "required_string_group", required = true) Integer requiredStringGroup,
429-
@Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
429+
@NotNull @Parameter(name = "required_boolean_group", description = "Required Boolean in group parameters", required = true) @RequestHeader(value = "required_boolean_group", required = true) Boolean requiredBooleanGroup,
430430
@NotNull @Parameter(name = "required_int64_group", description = "Required Integer in group parameters", required = true) @Valid @RequestParam(value = "required_int64_group", required = true) Long requiredInt64Group,
431431
@Parameter(name = "string_group", description = "String in group parameters") @Valid @RequestParam(value = "string_group", required = false) Optional<Integer> stringGroup,
432432
@Parameter(name = "boolean_group", description = "Boolean in group parameters") @RequestHeader(value = "boolean_group", required = false) Optional<Boolean> booleanGroup,

0 commit comments

Comments
 (0)