Skip to content

Commit 910ceb9

Browse files
committed
Merge pull request #1095 from iushankin/issue-970
Fixed #970: DefaultValue missing in post body of swagger.json in 1.5.3-M1
2 parents 6875dfe + 617035c commit 910ceb9

File tree

6 files changed

+185
-51
lines changed

6 files changed

+185
-51
lines changed

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

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.swagger.jaxrs;
22

3-
import io.swagger.jaxrs.ext.SwaggerExtension;
43
import io.swagger.converter.ModelConverters;
54
import io.swagger.jaxrs.ext.AbstractSwaggerExtension;
5+
import io.swagger.jaxrs.ext.SwaggerExtension;
66
import io.swagger.models.parameters.CookieParameter;
77
import io.swagger.models.parameters.FormParameter;
88
import io.swagger.models.parameters.HeaderParameter;
@@ -14,41 +14,34 @@
1414
import io.swagger.models.properties.RefProperty;
1515
import io.swagger.models.properties.StringProperty;
1616

17-
import java.util.*;
1817
import java.lang.annotation.Annotation;
1918
import java.lang.reflect.Type;
19+
import java.util.ArrayList;
20+
import java.util.Iterator;
21+
import java.util.List;
22+
import java.util.Set;
2023

21-
import javax.ws.rs.QueryParam;
22-
import javax.ws.rs.PathParam;
23-
import javax.ws.rs.HeaderParam;
2424
import javax.ws.rs.CookieParam;
2525
import javax.ws.rs.FormParam;
26-
import javax.ws.rs.DefaultValue;
26+
import javax.ws.rs.HeaderParam;
27+
import javax.ws.rs.PathParam;
28+
import javax.ws.rs.QueryParam;
2729

2830
public class DefaultParameterExtension extends AbstractSwaggerExtension {
2931

3032
@Override
3133
public List<Parameter> extractParameters(List<Annotation> annotations, Type type, Set<Type> typesToSkip, Iterator<SwaggerExtension> chain) {
32-
String defaultValue = "";
33-
3434
if(shouldIgnoreType(type, typesToSkip))
3535
return new ArrayList<Parameter>();
3636

3737
List<Parameter> parameters = new ArrayList<Parameter>();
3838
Parameter parameter = null;
3939
for(Annotation annotation : annotations) {
40-
if(annotation instanceof DefaultValue) {
41-
DefaultValue defaultValueAnnotation = (DefaultValue) annotation;
42-
defaultValue = defaultValueAnnotation.value();
43-
}
4440
if(annotation instanceof QueryParam) {
4541
QueryParam param = (QueryParam) annotation;
4642
QueryParameter qp = new QueryParameter()
4743
.name(param.value());
4844

49-
if(!defaultValue.isEmpty()) {
50-
qp.setDefaultValue(defaultValue);
51-
}
5245
Property schema = createProperty(type);
5346
if(schema != null)
5447
qp.setProperty(schema);
@@ -58,8 +51,6 @@ else if(annotation instanceof PathParam) {
5851
PathParam param = (PathParam) annotation;
5952
PathParameter pp = new PathParameter()
6053
.name(param.value());
61-
if(!defaultValue.isEmpty())
62-
pp.setDefaultValue(defaultValue);
6354
Property schema = createProperty(type);
6455
if(schema != null)
6556
pp.setProperty(schema);
@@ -69,7 +60,6 @@ else if(annotation instanceof HeaderParam) {
6960
HeaderParam param = (HeaderParam) annotation;
7061
HeaderParameter hp = new HeaderParameter()
7162
.name(param.value());
72-
hp.setDefaultValue(defaultValue);
7363
Property schema = createProperty(type);
7464
if(schema != null)
7565
hp.setProperty(schema);
@@ -79,8 +69,6 @@ else if(annotation instanceof CookieParam) {
7969
CookieParam param = (CookieParam) annotation;
8070
CookieParameter cp = new CookieParameter()
8171
.name(param.value());
82-
if(!defaultValue.isEmpty())
83-
cp.setDefaultValue(defaultValue);
8472
Property schema = createProperty(type);
8573
if(schema != null)
8674
cp.setProperty(schema);
@@ -90,8 +78,6 @@ else if(annotation instanceof FormParam) {
9078
FormParam param = (FormParam) annotation;
9179
FormParameter fp = new FormParameter()
9280
.name(param.value());
93-
if(!defaultValue.isEmpty())
94-
fp.setDefaultValue(defaultValue);
9581
Property schema = createProperty(type);
9682
if(schema != null)
9783
fp.setProperty(schema);

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

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
package io.swagger.jaxrs;
22

33
import io.swagger.annotations.ApiImplicitParam;
4+
import io.swagger.annotations.ApiParam;
5+
import io.swagger.converter.ModelConverters;
6+
import io.swagger.models.ArrayModel;
7+
import io.swagger.models.Model;
8+
import io.swagger.models.ModelImpl;
9+
import io.swagger.models.RefModel;
10+
import io.swagger.models.Swagger;
11+
import io.swagger.models.parameters.AbstractSerializableParameter;
12+
import io.swagger.models.parameters.BodyParameter;
13+
import io.swagger.models.parameters.Parameter;
14+
import io.swagger.models.properties.ArrayProperty;
15+
import io.swagger.models.properties.Property;
16+
import io.swagger.models.properties.PropertyBuilder;
17+
import io.swagger.models.properties.RefProperty;
418

519
import java.lang.annotation.Annotation;
620
import java.lang.reflect.Method;
@@ -9,12 +23,9 @@
923
import java.util.List;
1024
import java.util.Map;
1125

26+
import javax.ws.rs.DefaultValue;
1227
import javax.ws.rs.core.Context;
1328

14-
import io.swagger.models.ModelImpl;
15-
import io.swagger.models.Swagger;
16-
import io.swagger.models.parameters.AbstractSerializableParameter;
17-
import io.swagger.models.properties.PropertyBuilder;
1829
import org.apache.commons.lang3.StringUtils;
1930
import org.slf4j.Logger;
2031
import org.slf4j.LoggerFactory;
@@ -23,16 +34,6 @@
2334
import com.fasterxml.jackson.databind.type.TypeFactory;
2435
import com.google.common.collect.HashBasedTable;
2536
import com.google.common.collect.Table;
26-
import io.swagger.annotations.ApiParam;
27-
import io.swagger.converter.ModelConverters;
28-
import io.swagger.models.ArrayModel;
29-
import io.swagger.models.Model;
30-
import io.swagger.models.RefModel;
31-
import io.swagger.models.parameters.BodyParameter;
32-
import io.swagger.models.parameters.Parameter;
33-
import io.swagger.models.properties.ArrayProperty;
34-
import io.swagger.models.properties.Property;
35-
import io.swagger.models.properties.RefProperty;
3637

3738
public class ParameterProcessor {
3839
static Logger LOGGER = LoggerFactory.getLogger(ParameterProcessor.class);
@@ -52,6 +53,7 @@ public static Parameter applyAnnotations(Swagger swagger, Parameter parameter, T
5253
return null;
5354
}
5455
final ParamWrapper<?> param = helper.getApiParam();
56+
final String defaultValue = helper.getDefaultValue();
5557
final JavaType javaType = TypeFactory.defaultInstance().constructType(type);
5658
if (parameter instanceof AbstractSerializableParameter) {
5759
final AbstractSerializableParameter<?> p = (AbstractSerializableParameter<?>) parameter;
@@ -80,7 +82,6 @@ public static Parameter applyAnnotations(Swagger swagger, Parameter parameter, T
8082
}
8183
}
8284

83-
final String defaultValue = param.getDefaultValue();
8485
if (p.getItems() != null || param.isAllowMultiple()) {
8586
if (p.getItems() == null) {
8687
// Convert to array
@@ -102,14 +103,14 @@ public static Parameter applyAnnotations(Swagger swagger, Parameter parameter, T
102103
}
103104

104105
final Map<PropertyBuilder.PropertyId, Object> args = new EnumMap<PropertyBuilder.PropertyId, Object>(PropertyBuilder.PropertyId.class);
105-
if (!defaultValue.isEmpty()) {
106+
if (StringUtils.isNotEmpty(defaultValue)) {
106107
args.put(PropertyBuilder.PropertyId.DEFAULT, defaultValue);
107108
}
108109
processAllowedValues(allowableValues, true, args);
109110
PropertyBuilder.merge(p.getItems(), args);
110111
p.collectionFormat("csv");
111112
} else {
112-
if (!defaultValue.isEmpty()) {
113+
if (StringUtils.isNotEmpty(defaultValue)) {
113114
p.setDefaultValue(defaultValue);
114115
}
115116
processAllowedValues(allowableValues, false, p);
@@ -147,6 +148,9 @@ public static Parameter applyAnnotations(Swagger swagger, Parameter parameter, T
147148
}
148149
else {
149150
LOGGER.debug("found inner property " + innerProperty);
151+
if (StringUtils.isNotEmpty(defaultValue)) {
152+
innerProperty.setDefault(defaultValue);
153+
}
150154
bp.setSchema(new ArrayModel().items(innerProperty));
151155

152156
// creation of ref property doesn't add model to definitions - do it now instead
@@ -182,6 +186,9 @@ public static Parameter applyAnnotations(Swagger swagger, Parameter parameter, T
182186
model.setType(prop.getType());
183187
model.setFormat(prop.getFormat());
184188
model.setDescription(prop.getDescription());
189+
if (StringUtils.isNotEmpty(defaultValue)) {
190+
model.setDefaultValue(defaultValue);
191+
}
185192
bp.setSchema(model);
186193
}
187194
}
@@ -209,21 +216,26 @@ private static class AnnotationsHelper {
209216
private static final ApiParam DEFAULT_API_PARAM = getDefaultApiParam(null);
210217
private boolean context;
211218
private ParamWrapper apiParam = new ApiParamWrapper(DEFAULT_API_PARAM);
219+
private String defaultValue;
212220

213221
/**
214222
* Constructs an instance.
215223
* @param annotations array or parameter annotations
216224
*/
217225
public AnnotationsHelper(List<Annotation> annotations) {
226+
String rsDefault = null;
218227
for (Annotation item : annotations) {
219228
if (item instanceof Context) {
220229
context = true;
221230
} else if (item instanceof ApiParam) {
222231
apiParam = new ApiParamWrapper((ApiParam) item);
223232
} else if (item instanceof ApiImplicitParam) {
224233
apiParam = new ApiImplicitParamWrapper((ApiImplicitParam) item);
234+
} else if (item instanceof DefaultValue) {
235+
rsDefault = ((DefaultValue) item).value();
225236
}
226237
}
238+
defaultValue = StringUtils.isNotEmpty(apiParam.getDefaultValue()) ? apiParam.getDefaultValue() : rsDefault;
227239
}
228240

229241
/**
@@ -243,6 +255,14 @@ public ParamWrapper getApiParam() {
243255
return apiParam;
244256
}
245257

258+
/**
259+
* Returns default value from annotation.
260+
* @return default value from annotation
261+
*/
262+
public String getDefaultValue() {
263+
return defaultValue;
264+
}
265+
246266
/**
247267
* Returns a default @{@link ApiParam} annotation for parameters without it.
248268
* @param annotationHolder a placeholder for default @{@link ApiParam}

modules/swagger-jersey2-jaxrs/src/test/scala/ScannerTest.scala

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import io.swagger.jaxrs.Reader
2-
import io.swagger.models.Swagger
2+
import io.swagger.models.{ModelImpl, Swagger}
33
import io.swagger.models.properties.MapProperty
44
import io.swagger.util.Json
55
import resources._
66

77
import io.swagger.jaxrs.config._
88
import io.swagger.models.parameters._
99

10-
11-
import scala.collection.JavaConverters._
12-
1310
import org.junit.runner.RunWith
1411
import org.scalatest.junit.JUnitRunner
1512
import org.scalatest.FlatSpec
@@ -42,4 +39,30 @@ class ScannerTest extends FlatSpec with Matchers {
4239
swagger.getDefinitions() should not be (null)
4340
swagger.getDefinitions().get( "ClassWithString" ) should not be (null)
4441
}
45-
}
42+
43+
it should "scan a bean param resource" in {
44+
val swagger = new Reader(new Swagger()).read(classOf[ResourceWithBeanParams])
45+
46+
val get = swagger.getPaths().get("/bean/{id}").getGet()
47+
val params = get.getParameters()
48+
49+
val headerParam1 = params.get(0).asInstanceOf[HeaderParameter]
50+
headerParam1.getDefaultValue() should be("1")
51+
headerParam1.getName() should be("test order annotation 1")
52+
53+
val headerParam2 = params.get(1).asInstanceOf[HeaderParameter]
54+
headerParam2.getDefaultValue() should be("2")
55+
headerParam2.getName() should be("test order annotation 2")
56+
57+
val priority1 = params.get(2).asInstanceOf[QueryParameter]
58+
priority1.getDefaultValue() should be("overridden")
59+
priority1.getName() should be("test priority 1")
60+
61+
val priority2 = params.get(3).asInstanceOf[QueryParameter]
62+
priority2.getDefaultValue() should be("overridden")
63+
priority2.getName() should be("test priority 2")
64+
65+
val bodyParam1 = params.get(4).asInstanceOf[BodyParameter].getSchema().asInstanceOf[ModelImpl]
66+
bodyParam1.getDefaultValue() should be ("bodyParam")
67+
}
68+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package models;
2+
3+
import io.swagger.annotations.ApiParam;
4+
5+
import javax.ws.rs.DefaultValue;
6+
import javax.ws.rs.HeaderParam;
7+
import javax.ws.rs.QueryParam;
8+
9+
10+
public class TestBeanParam {
11+
12+
@HeaderParam("test order annotation 1")
13+
@DefaultValue("1")
14+
private Integer order1;
15+
16+
@DefaultValue("2")
17+
@HeaderParam("test order annotation 2")
18+
private Integer order2;
19+
20+
@QueryParam("priority1")
21+
@DefaultValue("default")
22+
@ApiParam(name = "test priority 1", defaultValue = "overridden")
23+
private Integer priority1;
24+
25+
@QueryParam("priority2")
26+
@ApiParam(name = "test priority 2", defaultValue = "overridden")
27+
@DefaultValue("default")
28+
private Integer priority2;
29+
30+
public Integer getOrder1() {
31+
return order1;
32+
}
33+
34+
public void setOrder1(Integer order1) {
35+
this.order1 = order1;
36+
}
37+
38+
public Integer getOrder2() {
39+
return order2;
40+
}
41+
42+
public void setOrder2(Integer order2) {
43+
this.order2 = order2;
44+
}
45+
46+
public Integer getPriority1() {
47+
return priority1;
48+
}
49+
50+
public void setPriority1(Integer priority1) {
51+
this.priority1 = priority1;
52+
}
53+
54+
public Integer getPriority2() {
55+
return priority2;
56+
}
57+
58+
public void setPriority2(Integer priority2) {
59+
this.priority2 = priority2;
60+
}
61+
}

modules/swagger-jersey2-jaxrs/src/test/scala/resources/ResourceWithBeanParams.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@
44
import io.swagger.annotations.ApiOperation;
55
import io.swagger.annotations.ApiResponse;
66
import io.swagger.annotations.ApiResponses;
7-
import models.*;
7+
import models.NotFoundModel;
8+
import models.Pagination;
9+
import models.TestBeanParam;
810

9-
import javax.ws.rs.*;
11+
import java.util.HashMap;
12+
import java.util.Map;
1013

11-
import java.util.*;
14+
import javax.ws.rs.BeanParam;
15+
import javax.ws.rs.DefaultValue;
16+
import javax.ws.rs.GET;
17+
import javax.ws.rs.Path;
18+
import javax.ws.rs.WebApplicationException;
1219

1320
@Api(value = "/basic", description = "Basic resource")
1421
public class ResourceWithBeanParams {
@@ -26,4 +33,17 @@ public Map<String, Integer> getTest(
2633
) throws WebApplicationException {
2734
return new HashMap<String, Integer>();
2835
}
36+
37+
@GET
38+
@Path("/bean/{id}")
39+
@ApiOperation(value = "Get test object by ID",
40+
notes = "No details provided")
41+
@ApiResponses({
42+
@ApiResponse(code = 400, message = "Invalid ID", response = NotFoundModel.class),
43+
@ApiResponse(code = 404, message = "object not found")})
44+
public Map<String, Integer> getTestBeanParams(@BeanParam TestBeanParam params, @DefaultValue("bodyParam") String
45+
testBody) throws
46+
WebApplicationException {
47+
return new HashMap<String, Integer>();
48+
}
2949
}

0 commit comments

Comments
 (0)