Skip to content

Commit

Permalink
fix: stops reprocessing parameters extracted from nested BeanParam
Browse files Browse the repository at this point in the history
  • Loading branch information
vitormelo95 authored and Vitor Melo committed Jan 6, 2023
1 parent 25debf5 commit 86c64de
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -256,33 +256,17 @@ private boolean handleAdditionalAnnotation(List<Parameter> parameters, List<Para
resolvedParameter.parameters;

for (Parameter p : extractedParameters) {
Parameter processedParam = ParameterProcessor.applyAnnotations(
p,
paramType,
paramAnnotations,
components,
classConsumes == null ? new String[0] : classConsumes.value(),
methodConsumes == null ? new String[0] : methodConsumes.value(),
jsonViewAnnotation);
if (processedParam != null) {
parameters.add(processedParam);
if (p != null) {
parameters.add(p);
}
}

List<Parameter> extractedFormParameters =
resolvedParameter.formParameters;

for (Parameter p : extractedFormParameters) {
Parameter processedParam = ParameterProcessor.applyAnnotations(
p,
paramType,
paramAnnotations,
components,
classConsumes == null ? new String[0] : classConsumes.value(),
methodConsumes == null ? new String[0] : methodConsumes.value(),
jsonViewAnnotation);
if (processedParam != null) {
formParameters.add(processedParam);
if (p != null) {
formParameters.add(p);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import io.swagger.v3.jaxrs2.resources.model.NestedBeanParam;
import io.swagger.v3.oas.models.media.IntegerSchema;
import org.testng.Assert;
import org.testng.annotations.Test;

Expand All @@ -23,6 +25,13 @@ private static class MyBeanParamResource {
public String getWithBeanParam(@BeanParam ListOfStringsBeanParam listOfStringsBean) {
return "result";
}

@GET
@Path("/nested-param")
public String getWithNestedBeanParam(@BeanParam NestedBeanParam listOfStringsBean) {
return "result";
}

}

@Test(description = "check array type of serialized BeanParam containing QueryParams") // tests issue #2466
Expand All @@ -35,7 +44,21 @@ public void shouldSerializeTypeParameter() {
Schema<?> schema = param.getSchema();
// These are the important checks:
Assert.assertEquals(schema.getClass(), ArraySchema.class);
Assert.assertEquals(((ArraySchema) schema).getItems().getType(), "string");
Assert.assertEquals(((ArraySchema) schema).getItems().getType(), "string");
}

@Test(description = "check integer type of nested BeanParam containing a QueryParam") // tests issue #2466
public void shouldSerializeNestedTypeParameter() {
OpenAPI openApi = new Reader(new OpenAPI()).read(MyBeanParamResource.class);
List<Parameter> getOperationParams = openApi.getPaths().get("/nested-param").getGet().getParameters();
Assert.assertEquals(getOperationParams.size(), 1);

Parameter queryParam = getOperationParams.get(0);
Assert.assertEquals(queryParam.getName(), "queryParam");
Schema<?> schema = queryParam.getSchema();
Assert.assertEquals(schema.getClass(), IntegerSchema.class);
Assert.assertEquals(schema.getType(), "integer");
Assert.assertEquals(((IntegerSchema) schema).getDefault(), 10);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.swagger.v3.jaxrs2;

import io.swagger.v3.jaxrs2.resources.model.FormParamBean;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.MediaType;
import io.swagger.v3.oas.models.media.Schema;
Expand All @@ -12,30 +13,6 @@

public class FormParamBeanTest {

private static class FormParamBean {
@FormParam(value = "param1")
private String param1;

@FormParam(value = "param2")
private String param2;

public String getParam1() {
return param1;
}

public void setParam1(String param1) {
this.param1 = param1;
}

public String getParam2() {
return param2;
}

public void setParam2(String param2) {
this.param2 = param2;
}
}

@Path("/")
private static class MyFormBeanParamResource {
@GET
Expand All @@ -53,9 +30,10 @@ public void shouldSerializeTypeParameter() {
MediaType mediaType = requestBody.getContent().get("application/x-www-form-urlencoded");
Assert.assertNotNull(mediaType);
Schema schema = mediaType.getSchema();
Assert.assertEquals(schema.getProperties().size(), 2);
Assert.assertEquals(schema.getProperties().size(), 3);
Assert.assertEquals(schema.getProperties().get("param1"), new StringSchema());
Assert.assertEquals(schema.getProperties().get("param2"), new StringSchema());
Assert.assertEquals(schema.getProperties().get("param3"), new StringSchema());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package io.swagger.v3.jaxrs2.resources.model;

import javax.ws.rs.BeanParam;
import javax.ws.rs.FormParam;

public class FormParamBean {

@FormParam(value = "param1")
private String param1;

@FormParam(value = "param2")
private String param2;

@BeanParam
private NestedBeanParam nestedParams;

public String getParam1() {
return param1;
}

public void setParam1(String param1) {
this.param1 = param1;
}

public String getParam2() {
return param2;
}

public void setParam2(String param2) {
this.param2 = param2;
}

public NestedBeanParam getNestedParams() {
return nestedParams;
}

public void setNestedParams(final NestedBeanParam nestedParams) {
this.nestedParams = nestedParams;
}

private static class NestedBeanParam {
@FormParam(value = "param3")
private String param3;
public String getParam3() {
return param3;
}

public void setParam3(String param3) {
this.param3 = param3;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.swagger.v3.jaxrs2.resources.model;

import javax.ws.rs.BeanParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.QueryParam;

public class NestedBeanParam {

@BeanParam
private NestedClass nestedParams;

public NestedClass getNestedParams() {
return nestedParams;
}

public void setNestedParams(final NestedClass nestedParams) {
this.nestedParams = nestedParams;
}

public class NestedClass {
@QueryParam(value = "queryParam")
@DefaultValue("10")
private Integer queryParam = 10;
public Integer getQueryParam() {
return queryParam;
}

public void setQueryParam(final Integer queryParam) {
this.queryParam = queryParam;
}
}
}

0 comments on commit 86c64de

Please sign in to comment.