Skip to content

Commit de62b78

Browse files
committed
fixing issue #684 - added test and solution to avoid NPE
1 parent 81c3efd commit de62b78

File tree

3 files changed

+223
-4
lines changed

3 files changed

+223
-4
lines changed

modules/swagger-parser/src/main/java/io/swagger/parser/processors/ParameterProcessor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ public List<Parameter> processParameters(List<Parameter> parameters) {
4444
// if the parameter exists, replace it
4545
boolean matched = false;
4646
for(Parameter param : processedPathLevelParameters) {
47-
if(param.getName().equals(resolvedParameter.getName())) {
48-
// ref param wins
49-
matched = true;
50-
break;
47+
if (param.getName() != null) {
48+
if (param.getName().equals(resolvedParameter.getName())) {
49+
// ref param wins
50+
matched = true;
51+
break;
52+
}
5153
}
5254
}
5355
for(Parameter param : parameters) {

modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.swagger.models.parameters.Parameter;
2020
import io.swagger.models.parameters.PathParameter;
2121
import io.swagger.models.parameters.QueryParameter;
22+
import io.swagger.models.parameters.RefParameter;
2223
import io.swagger.models.parameters.SerializableParameter;
2324
import io.swagger.models.properties.ArrayProperty;
2425
import io.swagger.models.properties.ByteArrayProperty;
@@ -52,6 +53,14 @@
5253

5354
public class SwaggerParserTest {
5455

56+
@Test
57+
public void testNPEIssue684() throws Exception {
58+
SwaggerParser parser = new SwaggerParser();
59+
final Swagger swagger = parser.read("src/test/resources/issue-684.json");
60+
Assert.assertNotNull(swagger);
61+
assertTrue(swagger.getParameters().get("ParamDef3") instanceof RefParameter);
62+
}
63+
5564
@Test
5665
public void testRefPaths() throws Exception {
5766
String yaml = "swagger: '2.0'\n" +
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
{
2+
"swagger":"2.0",
3+
"info":{
4+
"title":"swagger_validParameters",
5+
"description":"BuildTookit parameter tests",
6+
"version":"1.0.0"
7+
},
8+
"host":"api.uber.com",
9+
"schemes":[
10+
"https"
11+
],
12+
"basePath":"/basePath",
13+
"produces":[
14+
"application/json"
15+
],
16+
"paths":{
17+
"/path1":{
18+
"parameters":[
19+
{
20+
"$ref":"#/parameters/ParamDef1"
21+
},
22+
{
23+
"$ref":"#/parameters/ParamDef3"
24+
},
25+
{
26+
"name":"paramDefinedInPath",
27+
"in":"path",
28+
"description":"paramDefinedInPath desc",
29+
"type":"integer",
30+
"format":"int32",
31+
"required":false,
32+
"allowEmptyValue":true
33+
},
34+
{
35+
"name":"paramDefinedInHeader",
36+
"in":"header",
37+
"description":"paramDefinedInHeader IN Path level",
38+
"type":"integer",
39+
"format":"int32",
40+
"required":false,
41+
"allowEmptyValue":true
42+
},
43+
{
44+
"name":"paramToBeOverride",
45+
"in":"header",
46+
"description":"paramToBeOverride defined in path level. It will be overridded by parameter in operation level",
47+
"type":"integer",
48+
"format":"int32",
49+
"required":true
50+
},
51+
{
52+
"name":"optParamToBeOverride",
53+
"in":"header",
54+
"description":"optParamToBeOverride defined in path level. It will be overridded by parameter in operation level",
55+
"type":"integer",
56+
"format":"int32",
57+
"required":true
58+
},
59+
{
60+
"name":"reqParamToBeOverride",
61+
"in":"header",
62+
"description":"reqParamToBeOverride defined in path level. It will be overridded by parameter in operation level",
63+
"type":"integer",
64+
"format":"int32",
65+
"required":false
66+
}
67+
],
68+
"post":{
69+
"parameters":[
70+
{
71+
"$ref":"#/parameters/ParamDef2"
72+
},
73+
{
74+
"name":"paramToBeOverride",
75+
"in":"header",
76+
"description":"paramToBeOverride in operation level",
77+
"type":"string",
78+
"required":true
79+
},
80+
{
81+
"name":"body",
82+
"description":"paramInBody desc",
83+
"required":true,
84+
"in":"body",
85+
"schema":{
86+
"$ref":"#/definitions/Def1"
87+
}
88+
},
89+
{
90+
"name":"optParamInPath",
91+
"in":"path",
92+
"description":"optParamInPath desc",
93+
"type":"integer",
94+
"format":"int32",
95+
"required":false,
96+
"allowEmptyValue":true
97+
},
98+
{
99+
"name":"optParamInHeader",
100+
"in":"header",
101+
"description":"optParamInHeader desc",
102+
"type":"integer",
103+
"format":"int32",
104+
"required":false,
105+
"allowEmptyValue":true
106+
},
107+
{
108+
"name":"optParamToBeOverride",
109+
"in":"header",
110+
"description":"paramToBeOverride in operation level",
111+
"type":"integer",
112+
"format":"int32",
113+
"required":false
114+
},
115+
{
116+
"name":"reqParamToBeOverride",
117+
"in":"header",
118+
"description":"paramToBeOverride in operation level",
119+
"type":"integer",
120+
"format":"int32",
121+
"required":true
122+
}
123+
],
124+
"responses":{
125+
"200":{
126+
"headers":{
127+
"respHeader1":{
128+
"type":"integer"
129+
}
130+
},
131+
"schema":{
132+
"$ref":"#/definitions/Def2"
133+
}
134+
}
135+
}
136+
}
137+
}
138+
},
139+
"parameters":{
140+
"ParamDef1":{
141+
"name":"paramDef1",
142+
"in":"header",
143+
"description":"paramDef1 desc",
144+
"type":"string",
145+
"required":true
146+
},
147+
"ParamDef2":{
148+
"name":"paramDef2",
149+
"in":"query",
150+
"description":"paramDef2 desc",
151+
"type":"number",
152+
"required":true
153+
},
154+
"ParamDef3":{
155+
"$ref":"#/parameters/ParamDef4"
156+
},
157+
"ParamDef4":{
158+
"name":"paramDef4",
159+
"in":"query",
160+
"description":"paramDef4 desc for paramDef3 reference",
161+
"type":"number",
162+
"required":true
163+
}
164+
},
165+
"definitions":{
166+
"Def1":{
167+
"type":"object",
168+
"properties":{
169+
"def1Prop1":{
170+
"type":"integer",
171+
"description":"Position in pagination."
172+
}
173+
}
174+
},
175+
"Def2":{
176+
"type":"object",
177+
"properties":{
178+
"def2Prop1":{
179+
"type":"integer",
180+
"description":"Position in pagination."
181+
},
182+
"def2Prop2":{
183+
"type":"array",
184+
"items":{
185+
"$ref":"#/definitions/Def3"
186+
}
187+
}
188+
}
189+
},
190+
"Def3":{
191+
"type":"object",
192+
"properties":{
193+
"def3Prop1":{
194+
"type":"string",
195+
"description":"Unique identifier for the activity"
196+
}
197+
}
198+
},
199+
"Def4":{
200+
"type":"array",
201+
"items":{
202+
"$ref":"#/definitions/Def3"
203+
},
204+
"minItems":1,
205+
"maxItems":100
206+
}
207+
}
208+
}

0 commit comments

Comments
 (0)