Skip to content

Commit 3d95db4

Browse files
[quarkus2] Fixed wrong use of @QueryParam annotation (#395)
* Fixed wrong use of @QueryParam annotation (#385) Signed-off-by: Helber Belmiro <[email protected]> * Replaced jakarta with javax --------- Signed-off-by: Helber Belmiro <[email protected]> Co-authored-by: Helber Belmiro <[email protected]>
1 parent 922e39c commit 3d95db4

File tree

8 files changed

+213
-19
lines changed

8 files changed

+213
-19
lines changed

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/template/QuteTemplatingEngineAdapter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class QuteTemplatingEngineAdapter extends AbstractTemplatingEngineAdapter
2525
"headerParams.qute",
2626
"pathParams.qute",
2727
"pojo.qute",
28+
"pojoQueryParam.qute",
2829
"queryParams.qute",
2930
"auth/compositeAuthenticationProvider.qute",
3031
"auth/headersFactory.qute",

deployment/src/main/resources/templates/pojo.qute

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@ public class {m.classname} {#if m.parent}extends {m.parent}{/if}{#if m.serializa
4848
* {m.description}
4949
**/
5050
{/if}
51-
{#if !v.isEnum}
52-
@javax.ws.rs.QueryParam("{v.name}")
53-
{/if}
5451
{#if v.isContainer}
5552
private {v.datatypeWithEnum} {v.name}{#if v.required} = {v.defaultValue}{#else} = null{/if};
5653
{#else}
@@ -150,4 +147,7 @@ public class {m.classname} {#if m.parent}extends {m.parent}{/if}{#if m.serializa
150147
}
151148
return o.toString().replace("\n", "\n ");
152149
}
150+
151+
{#include pojoQueryParam.qute m=m.model withXml=withXml codegen=classes-codegen package=modelPackage/}
152+
153153
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{#if withXml}
2+
@XmlAccessorType(XmlAccessType.FIELD)
3+
{#if m.hasVars}@XmlType(name = "{m.classname}", propOrder =
4+
{ {#for var in m.vars}"{var.name}"{#if var_hasNext}, {/if}{/for}
5+
}){#else}
6+
@XmlType(name = "{m.classname}")
7+
{/if}
8+
{#if !m.parent || m.parent.isEmpty}@XmlRootElement(name = "{m.classname}"){/if}
9+
{#else}
10+
@JsonIgnoreProperties(ignoreUnknown = true)
11+
{/if}
12+
{#if m.description}
13+
/**
14+
* {m.description}
15+
**/
16+
{/if}
17+
{#include additionalModelTypeAnnotations.qute m=m/}
18+
public static class {m.classname}QueryParam {#if m.parent}extends {m.parent}{/if}{#if m.serializableModel} implements Serializable{/if} {
19+
20+
{#for v in m.vars}
21+
{#if !v.deprecated || openapi:genDeprecatedModelAttr(package, m.classname, codegen)}
22+
{#if v.isEnum}
23+
{#if v.isContainer && v.mostInnerItems}
24+
{#include enumClass.qute e=v/}
25+
{#else if !v.isContainer}
26+
27+
{#include enumClass.qute e=v/}{/if}
28+
{/if}
29+
{#if withXml}
30+
@XmlElement(name="{v.basename}"{#if v.required}, required = {v.required}{/if})
31+
{/if}
32+
{#if m.description}
33+
/**
34+
* {m.description}
35+
**/
36+
{/if}
37+
{#if !v.isEnum}
38+
@javax.ws.rs.QueryParam("{v.name}")
39+
{/if}
40+
{#if v.isContainer}
41+
private {v.datatypeWithEnum} {v.name}{#if v.required} = {v.defaultValue}{#else} = null{/if};
42+
{#else}
43+
private {v.datatypeWithEnum} {v.name}{#if v.defaultValue} = {v.defaultValue}{/if};
44+
{/if}
45+
{/if}
46+
{/for}
47+
48+
{#for v in m.vars}
49+
{#if !v.deprecated || openapi:genDeprecatedModelAttr(package, m.classname, codegen)}
50+
/**
51+
{#if v.description}
52+
* {v.description}
53+
{#else}
54+
* Get {v.name}
55+
{/if}
56+
{#if v.minimum}
57+
* minimum: {v.minimum}
58+
{/if}
59+
{#if v.maximum}
60+
* maximum: {v.maximum}
61+
{/if}
62+
* @return {v.name}
63+
**/
64+
{#if !withXml}
65+
@JsonProperty("{v.baseName}")
66+
{/if}
67+
{#for ext in v.vendorExtensions.x-extra-annotation.orEmpty}
68+
{ext}
69+
{/for}
70+
{#if v.useBeanValidation}{#include beanValidation.qute p=v/}{/if}
71+
{#if v.isEnum && v.isContainer}public {v.datatypeWithEnum} {v.getter}(){
72+
return {v.name};
73+
}{#else if v.isEnum && !v.isArray && !v.isMap}public {v.datatypeWithEnum} {v.getter}() {
74+
return {v.name};
75+
}{#else if !v.isEnum && !v.isArray && !v.isMap}public {v.datatype} {v.getter}() {
76+
return {v.name};
77+
}{#else if !v.isEnum && (v.isArray || v.isMap)}public {v.datatype} {v.getter}() {
78+
return {v.name};
79+
}{#else if !v.isEnum}public {v.datatype} {v.getter}() {
80+
return {v.name};
81+
}{/if}
82+
83+
{#if !v.isReadOnly}
84+
/**
85+
* Set {v.name}
86+
**/
87+
public void {v.setter}({v.datatypeWithEnum} {v.name}) {
88+
this.{v.name} = {v.name};
89+
}
90+
91+
public {m.classname}QueryParam {v.name}({v.datatypeWithEnum} {v.name}) {
92+
this.{v.name} = {v.name};
93+
return this;
94+
}
95+
{#if v.isArray}
96+
public {m.classname}QueryParam add{v.nameInCamelCase}Item({v.items.datatypeWithEnum} {v.name}Item) {
97+
this.{v.name}.add({v.name}Item);
98+
return this;
99+
}
100+
{/if}
101+
{#if v.isMap}
102+
public {m.classname}QueryParam put{v.nameInCamelCase}Item(String key, {v.items.datatypeWithEnum} {v.name}Item) {
103+
this.{v.name}.put(key, {v.name}Item);
104+
return this;
105+
}
106+
{/if}
107+
{/if}
108+
109+
{/if}
110+
{/for}
111+
/**
112+
* Create a string representation of this pojo.
113+
**/
114+
@Override
115+
public String toString() {
116+
StringBuilder sb = new StringBuilder();
117+
sb.append("class {m.classname}QueryParam {\n");
118+
{#if m.parent}
119+
sb.append(" ").append(toIndentedString(super.toString())).append("\n");{/if}
120+
{#for v in m.vars}
121+
{#if !v.deprecated || openapi:genDeprecatedModelAttr(package, m.classname, codegen)}
122+
sb.append(" {v.name}: ").append(toIndentedString({v.name})).append("\n");
123+
{/if}
124+
{/for}
125+
sb.append("}");
126+
return sb.toString();
127+
}
128+
129+
/**
130+
* Convert the given object to string with each line indented by 4 spaces
131+
* (except the first line).
132+
*/
133+
private static String toIndentedString(Object o) {
134+
if (o == null) {
135+
return "null";
136+
}
137+
return o.toString().replace("\n", "\n ");
138+
}
139+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{#if param.isQueryParam}@GeneratedParam("{param.baseName}") {#if param.isModel}@BeanParam{#else}@QueryParam("{param.baseName}"){/if}{#if param.useBeanValidation}{#include beanValidationCore.qute p=param/}{/if} {#if param.isContainer}{#if param.defaultValue}@DefaultValue("\{{param.defaultValue}\}"){/if}{/if}{param.dataType} {param.paramName}{#else}{/if}
1+
{#if param.isQueryParam}@GeneratedParam("{param.baseName}") {#if param.isModel}@BeanParam{#else}@QueryParam("{param.baseName}"){/if}{#if param.useBeanValidation}{#include beanValidationCore.qute p=param/}{/if} {#if param.isContainer}{#if param.defaultValue}@DefaultValue("\{{param.defaultValue}\}"){/if}{/if}{#if param.isModel}{param.dataType}.{param.dataType}QueryParam{#else}{param.dataType}{/if} {param.paramName}{#else}{/if}

deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapperTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ void verifyDeprecatedFields() throws URISyntaxException, FileNotFoundException {
120120
final CompilationUnit cu = StaticJavaParser.parse(metaV1Condition.orElseThrow());
121121
final List<FieldDeclaration> fields = cu.findAll(FieldDeclaration.class);
122122

123-
assertThat(fields).extracting(FieldDeclaration::getVariables).hasSize(5);
123+
assertThat(fields).extracting(FieldDeclaration::getVariables).hasSize(10);
124124

125125
assertThat(fields.stream()
126126
.flatMap(v -> v.getVariables().stream())
@@ -369,7 +369,7 @@ void withoutAnyTypeOrImportMappingsItShouldGenerateUsingJava8DatesAndTimes()
369369
assertThat(file).isNotEmpty();
370370
CompilationUnit compilationUnit = StaticJavaParser.parse(file.orElseThrow());
371371
List<ClassOrInterfaceDeclaration> classes = compilationUnit.findAll(ClassOrInterfaceDeclaration.class);
372-
assertThat(classes).hasSize(1);
372+
assertThat(classes).hasSize(2);
373373
ClassOrInterfaceDeclaration generatedPojoClass = classes.get(0);
374374

375375
verifyGeneratedDateAndTimeTypes(
@@ -403,7 +403,7 @@ void shouldBeAbleToAddCustomDateAndTimeMappings() throws URISyntaxException, Fil
403403
assertThat(file).isNotEmpty();
404404
CompilationUnit compilationUnit = StaticJavaParser.parse(file.orElseThrow());
405405
List<ClassOrInterfaceDeclaration> classes = compilationUnit.findAll(ClassOrInterfaceDeclaration.class);
406-
assertThat(classes).hasSize(1);
406+
assertThat(classes).hasSize(2);
407407
ClassOrInterfaceDeclaration generatedPojoClass = classes.get(0);
408408

409409
verifyGeneratedDateAndTimeTypes(
@@ -537,7 +537,7 @@ void verifyAPINormalization() throws Exception {
537537
CompilationUnit compilationUnit = StaticJavaParser.parse(file.orElseThrow());
538538
List<ClassOrInterfaceDeclaration> types = compilationUnit.findAll(ClassOrInterfaceDeclaration.class);
539539

540-
assertThat(types).hasSize(1);
540+
assertThat(types).hasSize(2);
541541
assertThat(types.get(0).getExtendedTypes()).hasSize(1);
542542
assertThat(types.get(0).getExtendedTypes(0).getName()).isEqualTo(new SimpleName("Mammal"));
543543
}

integration-tests/beanparam/src/main/openapi/openapi.yaml

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ info:
88
url: http://www.apache.org/licenses/LICENSE-2.0
99
version: "4.0.0"
1010
tags:
11-
- name: GetTest
12-
description: GetTest Controller
11+
- name: BeanParamTest
12+
description: BeanParam Test Controller
1313
paths:
1414
/get:
1515
get:
1616
tags:
17-
- GetTest
17+
- BeanParamTest
1818
summary: getTest
1919
operationId: getTest
2020
parameters:
@@ -38,8 +38,41 @@ paths:
3838
403:
3939
$ref: "#/components/responses/ForbiddenResponse"
4040
deprecated: false
41+
/patch:
42+
patch:
43+
tags:
44+
- BeanParamTest
45+
summary: patchTest
46+
operationId: patchTest
47+
requestBody:
48+
required: true
49+
content:
50+
application/json:
51+
schema:
52+
$ref: '#/components/schemas/PatchRequestDto'
53+
responses:
54+
202:
55+
description: Accepted
56+
400:
57+
$ref: "#/components/responses/ErrorResponse"
58+
403:
59+
$ref: "#/components/responses/ForbiddenResponse"
60+
deprecated: false
4161
components:
4262
schemas:
63+
PatchRequestDto:
64+
title: PatchRequest
65+
type: object
66+
properties:
67+
name:
68+
type: string
69+
age:
70+
type: integer
71+
format: int32
72+
minimum: 0
73+
default: 0
74+
required:
75+
- name
4376
TestObj:
4477
title: Pageable
4578
type: object
Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package io.quarkiverse.openapi.generator.it;
22

3+
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
4+
import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
5+
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
6+
import static com.github.tomakehurst.wiremock.client.WireMock.patchRequestedFor;
7+
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
38
import static org.assertj.core.api.Assertions.assertThat;
49

510
import javax.inject.Inject;
611

712
import org.eclipse.microprofile.rest.client.inject.RestClient;
813
import org.junit.jupiter.api.Test;
9-
import org.openapi.quarkus.openapi_yaml.api.GetTestApi;
14+
import org.openapi.quarkus.openapi_yaml.api.BeanParamTestApi;
15+
import org.openapi.quarkus.openapi_yaml.model.PatchRequestDto;
1016
import org.openapi.quarkus.openapi_yaml.model.ResponseDto;
11-
import org.openapi.quarkus.openapi_yaml.model.TestObj;
17+
import org.openapi.quarkus.openapi_yaml.model.TestObj.TestObjQueryParam;
1218

1319
import com.github.tomakehurst.wiremock.WireMockServer;
14-
import com.github.tomakehurst.wiremock.client.WireMock;
1520

1621
import io.quarkus.test.common.QuarkusTestResource;
1722
import io.quarkus.test.junit.QuarkusTest;
@@ -22,19 +27,31 @@ class BeanParamOpenApiTest {
2227

2328
@RestClient
2429
@Inject
25-
GetTestApi api;
30+
BeanParamTestApi api;
2631

2732
WireMockServer wireMockServer;
2833

2934
@Test
30-
void apiIsBeingGenerated() {
31-
TestObj model = new TestObj();
35+
void getRequestReceivesQueryParam() {
36+
TestObjQueryParam model = new TestObjQueryParam();
3237
model.size(42);
3338

3439
ResponseDto responseDto = api.getTest(model, true);
3540
assertThat(responseDto.getMessage()).isEqualTo("Hello");
3641

37-
wireMockServer.verify(WireMock.getRequestedFor(
38-
WireMock.urlEqualTo("/get?size=42&unpaged=true")));
42+
wireMockServer.verify(getRequestedFor(urlEqualTo("/get?size=42&unpaged=true")));
43+
}
44+
45+
@Test
46+
void patchRequestReceivesParamsAsBody() {
47+
PatchRequestDto requestModel = new PatchRequestDto();
48+
requestModel.setName("Max");
49+
requestModel.setAge(42);
50+
51+
api.patchTest(requestModel);
52+
53+
wireMockServer.verify(patchRequestedFor(urlEqualTo("/patch"))
54+
.withHeader("Content-Type", equalTo("application/json"))
55+
.withRequestBody(equalToJson(" { \"name\": \"Max\", \"age\": 42 }")));
3956
}
4057
}

integration-tests/beanparam/src/test/java/io/quarkiverse/openapi/generator/it/WiremockBeanParam.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
44
import static com.github.tomakehurst.wiremock.client.WireMock.get;
5+
import static com.github.tomakehurst.wiremock.client.WireMock.patch;
56
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
67

78
import java.util.Map;
@@ -29,6 +30,9 @@ public Map<String, String> start() {
2930
.withBody(
3031
"{\"message\": \"Hello\"}")));
3132

33+
wireMockServer.stubFor(patch(urlPathEqualTo("/patch"))
34+
.willReturn(aResponse().withStatus(202)));
35+
3236
return Map.of(URL_KEY, wireMockServer.baseUrl());
3337
}
3438

0 commit comments

Comments
 (0)