diff --git a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java index 73a06abdf7..36a1359711 100644 --- a/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java +++ b/modules/swagger-jaxrs2/src/main/java/io/swagger/v3/jaxrs2/DefaultParameterExtension.java @@ -21,6 +21,7 @@ import javax.ws.rs.HeaderParam; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; +import javax.ws.rs.MatrixParam; import java.lang.annotation.Annotation; import java.lang.reflect.Type; import java.util.ArrayList; @@ -67,6 +68,13 @@ public ResolvedParameter extractParameters(List annotations, pp.setIn(PATH_PARAM); pp.setName(param.value()); parameter = pp; + } else if (annotation instanceof MatrixParam) { + MatrixParam param = (MatrixParam) annotation; + Parameter pp = new Parameter(); + pp.setIn(PATH_PARAM); + pp.setStyle(Parameter.StyleEnum.MATRIX); + pp.setName(param.value()); + parameter = pp; } else if (annotation instanceof HeaderParam) { HeaderParam param = (HeaderParam) annotation; Parameter pp = new Parameter(); diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/operations/AnnotatedOperationMethodTest.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/operations/AnnotatedOperationMethodTest.java index 8371d4d104..5fbbc56566 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/operations/AnnotatedOperationMethodTest.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/annotations/operations/AnnotatedOperationMethodTest.java @@ -412,6 +412,36 @@ public void testCompletePetResource() throws IOException { " $ref: '#/components/schemas/Pet'\n" + " 400:\n" + " description: Invalid tag value\n" + + " /pet/findByCategory/{category}:\n" + + " get:\n" + + " summary: Finds Pets by category\n" + + " operationId: findPetsByCategory\n" + + " parameters:\n" + + " - name: category\n" + + " in: path\n" + + " description: Category value that need to be considered for filter\n" + + " required: true\n" + + " style: matrix\n" + + " schema:\n" + + " $ref: '#/components/schemas/Category'\n" + + " - name: skip\n" + + " in: query\n" + + " schema:\n" + + " type: integer\n" + + " format: int32\n" + + " - name: limit\n" + + " in: query\n" + + " schema:\n" + + " type: integer\n" + + " format: int32\n" + + " responses:\n" + + " default:\n" + + " content:\n" + + " application/json:\n" + + " schema:\n" + + " $ref: '#/components/schemas/Pet'\n" + + " 400:\n" + + " description: Invalid category value\n" + " /pet/{petId}:\n" + " get:\n" + " summary: Find pet by ID\n" + diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResource.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResource.java index cff9c7ac75..0f93f66a16 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResource.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResource.java @@ -18,6 +18,7 @@ import io.swagger.v3.jaxrs2.resources.data.PetData; import io.swagger.v3.jaxrs2.resources.exception.NotFoundException; +import io.swagger.v3.jaxrs2.resources.model.Category; import io.swagger.v3.jaxrs2.resources.model.Pet; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -28,6 +29,7 @@ import javax.ws.rs.BeanParam; import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.MatrixParam; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -145,6 +147,25 @@ public Response findPetsByStatus( return Response.ok(petData.findPetByStatus(status)).build(); } + @GET + @Path("/findByCategory/{category}") + @Produces("application/xml") + @Operation(summary = "Finds Pets by category", + responses = { + @ApiResponse( + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Pet.class))), + @ApiResponse( + responseCode = "400", description = "Invalid category value" + )} + ) + public Response findPetsByCategory( + @Parameter(description = "Category value that need to be considered for filter", required = true) @MatrixParam("category") Category category, + @BeanParam QueryResultBean qr + ) { + return Response.ok(petData.findPetByCategory(category)).build(); + } + @GET @Path("/findByTags") @Produces("application/json") diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResourceSlashesinPath.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResourceSlashesinPath.java index aeb4eaac63..3a28b0d40a 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResourceSlashesinPath.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/PetResourceSlashesinPath.java @@ -18,6 +18,7 @@ import io.swagger.v3.jaxrs2.resources.data.PetData; import io.swagger.v3.jaxrs2.resources.exception.NotFoundException; +import io.swagger.v3.jaxrs2.resources.model.Category; import io.swagger.v3.jaxrs2.resources.model.Pet; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -28,6 +29,7 @@ import javax.ws.rs.BeanParam; import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.MatrixParam; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -161,4 +163,24 @@ public Response findPetsByTags( @Parameter(description = "Tags to filter by", required = true/*, allowMultiple = true*/) @QueryParam("tags") String tags) { return Response.ok(petData.findPetByTags(tags)).build(); } + + @GET + @Path("/findByCategory/{category}") + @Produces("application/xml") + @Operation(summary = "Finds Pets by category", + responses = { + @ApiResponse( + content = @Content(mediaType = "application/json", + schema = @Schema(implementation = Pet.class))), + @ApiResponse( + responseCode = "400", description = "Invalid category value" + )} + ) + public Response findPetsByCategory( + @Parameter(description = "Category value that need to be considered for filter", required = true) @MatrixParam("category") Category category, + @BeanParam QueryResultBean qr + ) { + return Response.ok(petData.findPetByCategory(category)).build(); + } + } diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/data/PetData.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/data/PetData.java index 4cf5583893..03d76dfdb1 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/data/PetData.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/data/PetData.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class PetData { static List pets = new ArrayList(); @@ -80,6 +81,10 @@ public List findPetByStatus(String status) { return result; } + public List findPetByCategory(Category category) { + return pets.stream().filter(pet -> category.equals(pet.getCategory())).collect(Collectors.toList()); + } + public List findPetByTags(String tags) { String[] tagList = tags.split(","); List result = new ArrayList(); diff --git a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Category.java b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Category.java index 8192467761..6b58bc241f 100644 --- a/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Category.java +++ b/modules/swagger-jaxrs2/src/test/java/io/swagger/v3/jaxrs2/resources/model/Category.java @@ -41,4 +41,11 @@ public String getName() { public void setName(String name) { this.name = name; } + + public Category() { + } + + public Category(String name) { + this.name = name; + } } \ No newline at end of file