Skip to content

Commit 5b885cd

Browse files
authored
[kotlin-spring] fix validation regression in kotlin-spring generator (#21255)
* fix #21238 regression in kotlin-spring generator * add tests for issue #21238
1 parent 68c1d89 commit 5b885cd

File tree

29 files changed

+156
-40
lines changed

29 files changed

+156
-40
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{{#isQueryParam}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}
1+
{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/swagger1AnnotationLibrary}}{{#useBeanValidation}} @Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}}

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,4 +1137,59 @@ public void nonReactiveWithFlow() throws Exception {
11371137
assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"),
11381138
"Flow<kotlin.String>");
11391139
}
1140+
1141+
@Test
1142+
public void testValidationsInQueryParams_issue21238_Controller() throws IOException {
1143+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1144+
KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
1145+
codegen.setOutputDir(output.getAbsolutePath());
1146+
1147+
List<File> files = new DefaultGenerator()
1148+
.opts(
1149+
new ClientOptInput()
1150+
.openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml"))
1151+
.config(codegen)
1152+
)
1153+
.generate();
1154+
1155+
Assertions.assertThat(files).contains(
1156+
new File(output, "src/main/kotlin/org/openapitools/api/PetApiController.kt"),
1157+
new File(output, "src/main/kotlin/org/openapitools/api/UserApiController.kt")
1158+
);
1159+
1160+
assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"),
1161+
"@NotNull", "@Valid");
1162+
assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApiController.kt"),
1163+
"@NotNull", "@Valid",
1164+
"@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")",
1165+
"@Parameter(description = \"The user name for login\", required = true)",
1166+
"@Parameter(description = \"The password for login in clear text\", required = true)");
1167+
}
1168+
1169+
@Test
1170+
public void testValidationsInQueryParams_issue21238_Api_Delegate() throws IOException {
1171+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1172+
KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
1173+
codegen.setOutputDir(output.getAbsolutePath());
1174+
codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true);
1175+
1176+
List<File> files = new DefaultGenerator()
1177+
.opts(
1178+
new ClientOptInput()
1179+
.openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml"))
1180+
.config(codegen)
1181+
)
1182+
.generate();
1183+
1184+
Assertions.assertThat(files).contains(
1185+
new File(output, "src/main/kotlin/org/openapitools/api/PetApi.kt"),
1186+
new File(output, "src/main/kotlin/org/openapitools/api/UserApi.kt")
1187+
);
1188+
1189+
assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"),
1190+
"@NotNull", "@Valid");
1191+
assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApi.kt"),
1192+
"@NotNull", "@Valid", "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")");
1193+
}
1194+
11401195
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
openapi: 3.0.0
2+
info:
3+
description: "Example to test fix for issue 21238, queryParam validation"
4+
license:
5+
name: Apache-2.0
6+
url: https://www.apache.org/licenses/LICENSE-2.0.html
7+
title: OpenAPI Query Param VAlidation
8+
version: 1.0.0
9+
paths:
10+
/pet/findByStatus:
11+
get:
12+
description: Multiple status values can be provided with comma separated strings
13+
operationId: findPetsByStatus
14+
parameters:
15+
- deprecated: true
16+
description: Status values that need to be considered for filter
17+
explode: false
18+
in: query
19+
name: status
20+
required: true
21+
schema:
22+
items:
23+
default: available
24+
enum:
25+
- available
26+
- pending
27+
- sold
28+
type: string
29+
type: array
30+
style: form
31+
responses:
32+
"200":
33+
summary: Finds Pets by status
34+
tags:
35+
- pet
36+
/user/login:
37+
get:
38+
operationId: loginUser
39+
parameters:
40+
- description: The user name for login
41+
explode: true
42+
in: query
43+
name: username
44+
required: true
45+
schema:
46+
pattern: "^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$"
47+
type: string
48+
style: form
49+
- description: The password for login in clear text
50+
explode: true
51+
in: query
52+
name: password
53+
required: true
54+
schema:
55+
type: string
56+
style: form
57+
responses:
58+
"200":
59+
summary: Logs user into the system
60+
tags:
61+
- user

samples/server/petstore/kotlin-spring-cloud/src/main/kotlin/org/openapitools/api/PetApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ interface PetApi {
5858
value = ["/pet/findByStatus"],
5959
produces = ["application/xml", "application/json"]
6060
)
61-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
61+
fun findPetsByStatus(@NotNull @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
6262
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
6363
}
6464

@@ -68,7 +68,7 @@ interface PetApi {
6868
value = ["/pet/findByTags"],
6969
produces = ["application/xml", "application/json"]
7070
)
71-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
71+
fun findPetsByTags(@NotNull @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
7272
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
7373
}
7474

samples/server/petstore/kotlin-spring-cloud/src/main/kotlin/org/openapitools/api/UserApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ interface UserApi {
8686
value = ["/user/login"],
8787
produces = ["application/xml", "application/json"]
8888
)
89-
fun loginUser( @RequestParam(value = "username", required = true) username: kotlin.String, @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
89+
fun loginUser(@NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
9090
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
9191
}
9292

samples/server/petstore/kotlin-spring-default/src/main/kotlin/org/openapitools/api/PetApiController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class PetApiController() {
8383
value = ["/pet/findByStatus"],
8484
produces = ["application/xml", "application/json"]
8585
)
86-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
86+
fun findPetsByStatus(@NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
8787
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
8888
}
8989

@@ -101,7 +101,7 @@ class PetApiController() {
101101
value = ["/pet/findByTags"],
102102
produces = ["application/xml", "application/json"]
103103
)
104-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
104+
fun findPetsByTags(@NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
105105
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
106106
}
107107

samples/server/petstore/kotlin-spring-default/src/main/kotlin/org/openapitools/api/UserApiController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class UserApiController() {
132132
value = ["/user/login"],
133133
produces = ["application/xml", "application/json"]
134134
)
135-
fun loginUser( @RequestParam(value = "username", required = true) username: kotlin.String, @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
135+
fun loginUser(@NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
136136
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
137137
}
138138

samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/PetApiController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) {
5454
value = ["/pet/findByStatus"],
5555
produces = ["application/xml", "application/json"]
5656
)
57-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
57+
fun findPetsByStatus(@NotNull @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
5858
return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200))
5959
}
6060

@@ -64,7 +64,7 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) {
6464
value = ["/pet/findByTags"],
6565
produces = ["application/xml", "application/json"]
6666
)
67-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
67+
fun findPetsByTags(@NotNull @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
6868
return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200))
6969
}
7070

samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/UserApiController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class UserApiController(@Autowired(required = true) val service: UserApiService)
8282
value = ["/user/login"],
8383
produces = ["application/xml", "application/json"]
8484
)
85-
fun loginUser( @RequestParam(value = "username", required = true) username: kotlin.String, @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
85+
fun loginUser(@NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
8686
return ResponseEntity(service.loginUser(username, password), HttpStatus.valueOf(200))
8787
}
8888

samples/server/petstore/kotlin-springboot-delegate-nodefaults/src/main/kotlin/org/openapitools/api/PetApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ interface PetApi {
9696
value = ["/pet/findByStatus"],
9797
produces = ["application/xml", "application/json"]
9898
)
99-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
99+
fun findPetsByStatus(@NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
100100
return getDelegate().findPetsByStatus(status)
101101
}
102102

@@ -116,7 +116,7 @@ interface PetApi {
116116
value = ["/pet/findByTags"],
117117
produces = ["application/xml", "application/json"]
118118
)
119-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
119+
fun findPetsByTags(@NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
120120
return getDelegate().findPetsByTags(tags)
121121
}
122122

samples/server/petstore/kotlin-springboot-delegate-nodefaults/src/main/kotlin/org/openapitools/api/UserApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ interface UserApi {
151151
value = ["/user/login"],
152152
produces = ["application/xml", "application/json"]
153153
)
154-
fun loginUser( @RequestParam(value = "username", required = true) username: kotlin.String, @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
154+
fun loginUser(@NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
155155
return getDelegate().loginUser(username, password)
156156
}
157157

samples/server/petstore/kotlin-springboot-delegate/src/main/kotlin/org/openapitools/api/PetApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ interface PetApi {
9595
value = ["/pet/findByStatus"],
9696
produces = ["application/xml", "application/json"]
9797
)
98-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
98+
fun findPetsByStatus(@NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
9999
return getDelegate().findPetsByStatus(status)
100100
}
101101

@@ -115,7 +115,7 @@ interface PetApi {
115115
value = ["/pet/findByTags"],
116116
produces = ["application/xml", "application/json"]
117117
)
118-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
118+
fun findPetsByTags(@NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
119119
return getDelegate().findPetsByTags(tags)
120120
}
121121

samples/server/petstore/kotlin-springboot-delegate/src/main/kotlin/org/openapitools/api/UserApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ interface UserApi {
150150
value = ["/user/login"],
151151
produces = ["application/xml", "application/json"]
152152
)
153-
fun loginUser( @RequestParam(value = "username", required = true) username: kotlin.String, @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
153+
fun loginUser(@NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String,@NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String): ResponseEntity<kotlin.String> {
154154
return getDelegate().loginUser(username, password)
155155
}
156156

samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/PetApiController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) {
8181
value = ["/pet/findByStatus"],
8282
produces = ["application/xml", "application/json"]
8383
)
84-
fun findPetsByStatus( @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
84+
fun findPetsByStatus(@NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
8585
return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200))
8686
}
8787

@@ -99,7 +99,7 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) {
9999
value = ["/pet/findByTags"],
100100
produces = ["application/xml", "application/json"]
101101
)
102-
fun findPetsByTags( @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
102+
fun findPetsByTags(@NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List<kotlin.String>): ResponseEntity<List<Pet>> {
103103
return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200))
104104
}
105105

0 commit comments

Comments
 (0)