Skip to content

Commit 018dd95

Browse files
authored
Merge pull request #2548 from swagger-api/issue-2466-updated
ref #2466 - retain generic types for attributes of BeanParam (Updated)
2 parents 2362df0 + 44e9d34 commit 018dd95

File tree

5 files changed

+176
-4
lines changed

5 files changed

+176
-4
lines changed

modules/swagger-jaxrs/src/main/java/io/swagger/jaxrs/DefaultParameterExtension.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public List<Parameter> extractParameters(List<Annotation> annotations, Type type
125125
*/
126126
private void handleAdditionalAnnotation(List<Parameter> parameters, Annotation annotation,
127127
final Type type, Set<Type> typesToSkip) {
128-
if (CLASS_BEAN_PARAM != null && CLASS_BEAN_PARAM.isAssignableFrom(annotation.getClass())) {
128+
if (isBeanParametersAggregatorAnnotation(annotation)) {
129129
// Use Jackson's logic for processing Beans
130130
final BeanDescription beanDesc = mapper.getSerializationConfig().introspect(constructType(type));
131131
final List<BeanPropertyDefinition> properties = beanDesc.findProperties();
@@ -140,7 +140,7 @@ private void handleAdditionalAnnotation(List<Parameter> parameters, Annotation a
140140

141141
// Gather the field's details
142142
if (field != null) {
143-
paramType = field.getRawType();
143+
paramType = field.getType();
144144

145145
for (final Annotation fieldAnnotation : field.annotations()) {
146146
if (!paramAnnotations.contains(fieldAnnotation)) {
@@ -153,7 +153,8 @@ private void handleAdditionalAnnotation(List<Parameter> parameters, Annotation a
153153
if (setter != null) {
154154
// Do not set the param class/type from the setter if the values are already identified
155155
if (paramType == null) {
156-
paramType = setter.getRawParameterTypes() != null ? setter.getRawParameterTypes()[0] : null;
156+
// paramType will stay null if there is no parameter
157+
paramType = setter.getParameterType(0);
157158
}
158159

159160
for (final Annotation fieldAnnotation : setter.annotations()) {
@@ -167,7 +168,7 @@ private void handleAdditionalAnnotation(List<Parameter> parameters, Annotation a
167168
if (getter != null) {
168169
// Do not set the param class/type from the getter if the values are already identified
169170
if (paramType == null) {
170-
paramType = getter.getRawReturnType();
171+
paramType = getter.getType();
171172
}
172173

173174
for (final Annotation fieldAnnotation : getter.annotations()) {
@@ -194,6 +195,10 @@ private void handleAdditionalAnnotation(List<Parameter> parameters, Annotation a
194195
}
195196
}
196197
}
198+
199+
protected boolean isBeanParametersAggregatorAnnotation(Annotation annotation) {
200+
return CLASS_BEAN_PARAM != null && CLASS_BEAN_PARAM.isAssignableFrom(annotation.getClass());
201+
}
197202

198203
@Override
199204
protected boolean shouldIgnoreClass(Class<?> cls) {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package io.swagger;
2+
3+
import java.lang.annotation.Annotation;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
import java.util.Collections;
9+
import java.util.List;
10+
11+
import javax.ws.rs.GET;
12+
import javax.ws.rs.Path;
13+
14+
import org.testng.Assert;
15+
import org.testng.annotations.AfterMethod;
16+
import org.testng.annotations.BeforeMethod;
17+
import org.testng.annotations.Test;
18+
19+
import io.swagger.annotations.Api;
20+
import io.swagger.jaxrs.DefaultParameterExtension;
21+
import io.swagger.jaxrs.Reader;
22+
import io.swagger.jaxrs.ext.SwaggerExtension;
23+
import io.swagger.jaxrs.ext.SwaggerExtensions;
24+
import io.swagger.models.ListOfStringsBeanParam;
25+
import io.swagger.models.Swagger;
26+
import io.swagger.models.parameters.Parameter;
27+
import io.swagger.models.parameters.QueryParameter;
28+
import io.swagger.models.properties.Property;
29+
import io.swagger.models.properties.StringProperty;
30+
31+
public class BeanParamTest {
32+
33+
@Target({ ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD })
34+
@Retention(RetentionPolicy.RUNTIME)
35+
public @interface MyBeanParam {
36+
// Remove this Annotation and use BeanParam directly with Swagger Core 2.0
37+
}
38+
39+
@Api
40+
@Path("/")
41+
private static class MyBeanParamResource {
42+
@GET
43+
public String getWithBeanParam(@MyBeanParam ListOfStringsBeanParam listOfStringsBean) {
44+
return "result";
45+
}
46+
}
47+
48+
private final SwaggerExtension myDefaultParameterExtension = new DefaultParameterExtension() {
49+
@Override
50+
protected boolean isBeanParametersAggregatorAnnotation(Annotation annotation) {
51+
return annotation instanceof MyBeanParam;
52+
}
53+
};
54+
55+
private List<SwaggerExtension> originalExtensions;
56+
57+
@BeforeMethod
58+
public void beforeMethod() {
59+
originalExtensions = SwaggerExtensions.getExtensions();
60+
SwaggerExtensions.setExtensions(Collections.singletonList(myDefaultParameterExtension));
61+
}
62+
63+
@AfterMethod
64+
public void afterMethod() {
65+
SwaggerExtensions.setExtensions(originalExtensions);
66+
}
67+
68+
@Test(description = "check array type of serialized BeanParam containing QueryParams") // tests issue #2466
69+
public void shouldSerializeTypeParameter() {
70+
Swagger swagger = new Reader(new Swagger()).read(MyBeanParamResource.class);
71+
List<Parameter> getOperationParams = swagger.getPath("/").getGet().getParameters();
72+
Assert.assertEquals(getOperationParams.size(), 1);
73+
QueryParameter param = (QueryParameter) getOperationParams.get(0);
74+
Assert.assertEquals(param.getName(), "listOfStrings");
75+
Assert.assertEquals(param.getType(), "array");
76+
// These are the important checks:
77+
Property itemsProperty = param.getItems();
78+
Assert.assertEquals(itemsProperty.getClass(), StringProperty.class);
79+
Assert.assertEquals(itemsProperty.getType(), "string");
80+
}
81+
82+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.swagger.models;
2+
3+
import java.util.List;
4+
5+
import javax.ws.rs.QueryParam;
6+
7+
import io.swagger.annotations.ApiModel;
8+
9+
@ApiModel
10+
public class ListOfStringsBeanParam {
11+
@QueryParam(value = "listOfStrings")
12+
private List<String> list;
13+
14+
public List<String> getList() {
15+
return list;
16+
}
17+
18+
public void setList(List<String> list) {
19+
this.list = list;
20+
}
21+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.swagger;
2+
3+
import io.swagger.annotations.Api;
4+
import io.swagger.jaxrs.Reader;
5+
import io.swagger.models.ListOfStringsBeanParam;
6+
import io.swagger.models.Swagger;
7+
import io.swagger.models.parameters.Parameter;
8+
import io.swagger.models.parameters.QueryParameter;
9+
import io.swagger.models.properties.Property;
10+
import io.swagger.models.properties.StringProperty;
11+
import org.testng.Assert;
12+
import org.testng.annotations.Test;
13+
14+
import javax.ws.rs.BeanParam;
15+
import javax.ws.rs.GET;
16+
import javax.ws.rs.Path;
17+
import java.util.List;
18+
19+
public class BeanParamTest {
20+
21+
@Api
22+
@Path("/")
23+
private static class MyBeanParamResource {
24+
@GET
25+
public String getWithBeanParam(@BeanParam ListOfStringsBeanParam listOfStringsBean) {
26+
return "result";
27+
}
28+
}
29+
30+
@Test(description = "check array type of serialized BeanParam containing QueryParams") // tests issue #2466
31+
public void shouldSerializeTypeParameter() {
32+
Swagger swagger = new Reader(new Swagger()).read(MyBeanParamResource.class);
33+
List<Parameter> getOperationParams = swagger.getPath("/").getGet().getParameters();
34+
Assert.assertEquals(getOperationParams.size(), 1);
35+
QueryParameter param = (QueryParameter) getOperationParams.get(0);
36+
Assert.assertEquals(param.getName(), "listOfStrings");
37+
Assert.assertEquals(param.getType(), "array");
38+
// These are the important checks:
39+
Property itemsProperty = param.getItems();
40+
Assert.assertEquals(itemsProperty.getClass(), StringProperty.class);
41+
Assert.assertEquals(itemsProperty.getType(), "string");
42+
}
43+
44+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.swagger.models;
2+
3+
import io.swagger.annotations.ApiModel;
4+
5+
import javax.ws.rs.QueryParam;
6+
import java.util.List;
7+
8+
@ApiModel
9+
public class ListOfStringsBeanParam {
10+
@QueryParam(value = "listOfStrings")
11+
private List<String> list;
12+
13+
public List<String> getList() {
14+
return list;
15+
}
16+
17+
public void setList(List<String> list) {
18+
this.list = list;
19+
}
20+
}

0 commit comments

Comments
 (0)