[JaxRS-CXF][bug #4330] support containers in return types (#4339)

* [JaxRS-CXF][bug #4330] support containers in return types

before this commit if a method returned a container (List or Map) of
THING (i.e. List<THING> or Map<String, THING>) the generated return type would
drop the container and only leave THING.
this commit fixes this issue such that the container type is properly
generated.

* regenerate jaxrs-cxf petstore sample
This commit is contained in:
Matan Rubin 2016-12-14 07:58:56 +02:00 committed by wing328
parent 90cf1cab53
commit 5867728724
10 changed files with 50 additions and 55 deletions

View File

@ -37,7 +37,7 @@ public interface {{classname}} {
@Produces({ {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }) @Produces({ {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} })
{{/hasProduces}} {{/hasProduces}}
@ApiOperation(value = "{{summary}}", tags={ {{#vendorExtensions.x-tags}}"{{tag}}"{{#hasMore}}, {{/hasMore}}{{/vendorExtensions.x-tags}} }) @ApiOperation(value = "{{summary}}", tags={ {{#vendorExtensions.x-tags}}"{{tag}}"{{#hasMore}}, {{/hasMore}}{{/vendorExtensions.x-tags}} })
public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); public {{>returnTypes}} {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
{{/operation}} {{/operation}}
} }
{{/operations}} {{/operations}}

View File

@ -28,7 +28,7 @@ import org.springframework.stereotype.Service;
public class {{classname}}ServiceImpl implements {{classname}} { public class {{classname}}ServiceImpl implements {{classname}} {
{{#operations}} {{#operations}}
{{#operation}} {{#operation}}
public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}}({{#allParams}}{{>queryParamsImpl}}{{>pathParamsImpl}}{{>headerParamsImpl}}{{>bodyParams}}{{>formParamsImpl}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { public {{>returnTypes}} {{nickname}}({{#allParams}}{{>queryParamsImpl}}{{>pathParamsImpl}}{{>headerParamsImpl}}{{>bodyParams}}{{>formParamsImpl}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {
// TODO: Implement... // TODO: Implement...
{{^vendorExtensions.x-java-is-response-void}}return null;{{/vendorExtensions.x-java-is-response-void}} {{^vendorExtensions.x-java-is-response-void}}return null;{{/vendorExtensions.x-java-is-response-void}}

View File

@ -103,7 +103,7 @@ public class {{classname}}Test {
{{#allParams}} {{#allParams}}
{{^isFile}}{{{dataType}}} {{paramName}} = null;{{/isFile}}{{#isFile}}org.apache.cxf.jaxrs.ext.multipart.Attachment {{paramName}} = null;{{/isFile}} {{^isFile}}{{{dataType}}} {{paramName}} = null;{{/isFile}}{{#isFile}}org.apache.cxf.jaxrs.ext.multipart.Attachment {{paramName}} = null;{{/isFile}}
{{/allParams}} {{/allParams}}
//{{^vendorExtensions.x-java-is-response-void}}{{{returnType}}} response = {{/vendorExtensions.x-java-is-response-void}}api.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); //{{^vendorExtensions.x-java-is-response-void}}{{>returnTypes}} response = {{/vendorExtensions.x-java-is-response-void}}api.{{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
{{^vendorExtensions.x-java-is-response-void}}//assertNotNull(response);{{/vendorExtensions.x-java-is-response-void}} {{^vendorExtensions.x-java-is-response-void}}//assertNotNull(response);{{/vendorExtensions.x-java-is-response-void}}
// TODO: test validations // TODO: test validations

View File

@ -0,0 +1 @@
{{#returnContainer}}{{#isMapContainer}}Map<String, {{{returnType}}}>{{/isMapContainer}}{{#isListContainer}}List<{{{returnType}}}>{{/isListContainer}}{{/returnContainer}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}

View File

@ -1,8 +1,8 @@
package io.swagger.api; package io.swagger.api;
import io.swagger.model.Pet;
import io.swagger.model.ModelApiResponse;
import java.io.File; import java.io.File;
import io.swagger.model.ModelApiResponse;
import io.swagger.model.Pet;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -18,8 +18,6 @@ import io.swagger.annotations.ApiOperation;
@Path("/") @Path("/")
@Api(value = "/", description = "") @Api(value = "/", description = "")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface PetApi { public interface PetApi {
@POST @POST
@ -27,51 +25,51 @@ public interface PetApi {
@Consumes({ "application/json", "application/xml" }) @Consumes({ "application/json", "application/xml" })
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Add a new pet to the store", tags={ "pet", }) @ApiOperation(value = "Add a new pet to the store", tags={ "pet", })
public void addPet(Pet body); public void addPet(Pet body);
@DELETE @DELETE
@Path("/pet/{petId}") @Path("/pet/{petId}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Deletes a pet", tags={ "pet", }) @ApiOperation(value = "Deletes a pet", tags={ "pet", })
public void deletePet(@PathParam("petId") Long petId, @HeaderParam("api_key") String apiKey); public void deletePet(@PathParam("petId") Long petId, @HeaderParam("api_key") String apiKey);
@GET @GET
@Path("/pet/findByStatus") @Path("/pet/findByStatus")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Finds Pets by status", tags={ "pet", }) @ApiOperation(value = "Finds Pets by status", tags={ "pet", })
public Pet findPetsByStatus(@QueryParam("status")List<String> status); public List<Pet> findPetsByStatus(@QueryParam("status")List<String> status);
@GET @GET
@Path("/pet/findByTags") @Path("/pet/findByTags")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Finds Pets by tags", tags={ "pet", }) @ApiOperation(value = "Finds Pets by tags", tags={ "pet", })
public Pet findPetsByTags(@QueryParam("tags")List<String> tags); public List<Pet> findPetsByTags(@QueryParam("tags")List<String> tags);
@GET @GET
@Path("/pet/{petId}") @Path("/pet/{petId}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Find pet by ID", tags={ "pet", }) @ApiOperation(value = "Find pet by ID", tags={ "pet", })
public Pet getPetById(@PathParam("petId") Long petId); public Pet getPetById(@PathParam("petId") Long petId);
@PUT @PUT
@Path("/pet") @Path("/pet")
@Consumes({ "application/json", "application/xml" }) @Consumes({ "application/json", "application/xml" })
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Update an existing pet", tags={ "pet", }) @ApiOperation(value = "Update an existing pet", tags={ "pet", })
public void updatePet(Pet body); public void updatePet(Pet body);
@POST @POST
@Path("/pet/{petId}") @Path("/pet/{petId}")
@Consumes({ "application/x-www-form-urlencoded" }) @Consumes({ "application/x-www-form-urlencoded" })
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Updates a pet in the store with form data", tags={ "pet", }) @ApiOperation(value = "Updates a pet in the store with form data", tags={ "pet", })
public void updatePetWithForm(@PathParam("petId") Long petId, @Multipart(value = "name", required = false) String name, @Multipart(value = "status", required = false) String status); public void updatePetWithForm(@PathParam("petId") Long petId, @Multipart(value = "name", required = false) String name, @Multipart(value = "status", required = false) String status);
@POST @POST
@Path("/pet/{petId}/uploadImage") @Path("/pet/{petId}/uploadImage")
@Consumes({ "multipart/form-data" }) @Consumes({ "multipart/form-data" })
@Produces({ "application/json" }) @Produces({ "application/json" })
@ApiOperation(value = "uploads an image", tags={ "pet" }) @ApiOperation(value = "uploads an image", tags={ "pet" })
public ModelApiResponse uploadFile(@PathParam("petId") Long petId, @Multipart(value = "additionalMetadata", required = false) String additionalMetadata, @Multipart(value = "file" , required = false) Attachment fileDetail); public ModelApiResponse uploadFile(@PathParam("petId") Long petId, @Multipart(value = "additionalMetadata", required = false) String additionalMetadata, @Multipart(value = "file" , required = false) Attachment fileDetail);
} }

View File

@ -17,32 +17,30 @@ import io.swagger.annotations.ApiOperation;
@Path("/") @Path("/")
@Api(value = "/", description = "") @Api(value = "/", description = "")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface StoreApi { public interface StoreApi {
@DELETE @DELETE
@Path("/store/order/{orderId}") @Path("/store/order/{orderId}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Delete purchase order by ID", tags={ "store", }) @ApiOperation(value = "Delete purchase order by ID", tags={ "store", })
public void deleteOrder(@PathParam("orderId") String orderId); public void deleteOrder(@PathParam("orderId") String orderId);
@GET @GET
@Path("/store/inventory") @Path("/store/inventory")
@Produces({ "application/json" }) @Produces({ "application/json" })
@ApiOperation(value = "Returns pet inventories by status", tags={ "store", }) @ApiOperation(value = "Returns pet inventories by status", tags={ "store", })
public Integer getInventory(); public Map<String, Integer> getInventory();
@GET @GET
@Path("/store/order/{orderId}") @Path("/store/order/{orderId}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Find purchase order by ID", tags={ "store", }) @ApiOperation(value = "Find purchase order by ID", tags={ "store", })
public Order getOrderById(@PathParam("orderId") Long orderId); public Order getOrderById(@PathParam("orderId") Long orderId);
@POST @POST
@Path("/store/order") @Path("/store/order")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Place an order for a pet", tags={ "store" }) @ApiOperation(value = "Place an order for a pet", tags={ "store" })
public Order placeOrder(Order body); public Order placeOrder(Order body);
} }

View File

@ -1,7 +1,7 @@
package io.swagger.api; package io.swagger.api;
import io.swagger.model.User;
import java.util.List; import java.util.List;
import io.swagger.model.User;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -17,56 +17,54 @@ import io.swagger.annotations.ApiOperation;
@Path("/") @Path("/")
@Api(value = "/", description = "") @Api(value = "/", description = "")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public interface UserApi { public interface UserApi {
@POST @POST
@Path("/user") @Path("/user")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Create user", tags={ "user", }) @ApiOperation(value = "Create user", tags={ "user", })
public void createUser(User body); public void createUser(User body);
@POST @POST
@Path("/user/createWithArray") @Path("/user/createWithArray")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Creates list of users with given input array", tags={ "user", }) @ApiOperation(value = "Creates list of users with given input array", tags={ "user", })
public void createUsersWithArrayInput(List<User> body); public void createUsersWithArrayInput(List<User> body);
@POST @POST
@Path("/user/createWithList") @Path("/user/createWithList")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Creates list of users with given input array", tags={ "user", }) @ApiOperation(value = "Creates list of users with given input array", tags={ "user", })
public void createUsersWithListInput(List<User> body); public void createUsersWithListInput(List<User> body);
@DELETE @DELETE
@Path("/user/{username}") @Path("/user/{username}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Delete user", tags={ "user", }) @ApiOperation(value = "Delete user", tags={ "user", })
public void deleteUser(@PathParam("username") String username); public void deleteUser(@PathParam("username") String username);
@GET @GET
@Path("/user/{username}") @Path("/user/{username}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Get user by user name", tags={ "user", }) @ApiOperation(value = "Get user by user name", tags={ "user", })
public User getUserByName(@PathParam("username") String username); public User getUserByName(@PathParam("username") String username);
@GET @GET
@Path("/user/login") @Path("/user/login")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Logs user into the system", tags={ "user", }) @ApiOperation(value = "Logs user into the system", tags={ "user", })
public String loginUser(@QueryParam("username")String username, @QueryParam("password")String password); public String loginUser(@QueryParam("username")String username, @QueryParam("password")String password);
@GET @GET
@Path("/user/logout") @Path("/user/logout")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Logs out current logged in user session", tags={ "user", }) @ApiOperation(value = "Logs out current logged in user session", tags={ "user", })
public void logoutUser(); public void logoutUser();
@PUT @PUT
@Path("/user/{username}") @Path("/user/{username}")
@Produces({ "application/xml", "application/json" }) @Produces({ "application/xml", "application/json" })
@ApiOperation(value = "Updated user", tags={ "user" }) @ApiOperation(value = "Updated user", tags={ "user" })
public void updateUser(@PathParam("username") String username, User body); public void updateUser(@PathParam("username") String username, User body);
} }

View File

@ -1,9 +1,9 @@
package io.swagger.api.impl; package io.swagger.api.impl;
import io.swagger.api.*; import io.swagger.api.*;
import io.swagger.model.Pet;
import io.swagger.model.ModelApiResponse;
import java.io.File; import java.io.File;
import io.swagger.model.ModelApiResponse;
import io.swagger.model.Pet;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -19,49 +19,49 @@ import org.apache.cxf.jaxrs.ext.multipart.*;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
public class PetApiServiceImpl implements PetApi { public class PetApiServiceImpl implements PetApi {
public void addPet(Pet body) { public void addPet(Pet body) {
// TODO: Implement... // TODO: Implement...
} }
public void deletePet(Long petId, String apiKey) { public void deletePet(Long petId, String apiKey) {
// TODO: Implement... // TODO: Implement...
} }
public Pet findPetsByStatus(List<String> status) { public List<Pet> findPetsByStatus(List<String> status) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public Pet findPetsByTags(List<String> tags) { public List<Pet> findPetsByTags(List<String> tags) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public Pet getPetById(Long petId) { public Pet getPetById(Long petId) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public void updatePet(Pet body) { public void updatePet(Pet body) {
// TODO: Implement... // TODO: Implement...
} }
public void updatePetWithForm(Long petId, String name, String status) { public void updatePetWithForm(Long petId, String name, String status) {
// TODO: Implement... // TODO: Implement...
} }
public ModelApiResponse uploadFile(Long petId, String additionalMetadata, Attachment fileDetail) { public ModelApiResponse uploadFile(Long petId, String additionalMetadata, Attachment fileDetail) {
// TODO: Implement... // TODO: Implement...
return null; return null;

View File

@ -18,25 +18,25 @@ import org.apache.cxf.jaxrs.ext.multipart.*;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
public class StoreApiServiceImpl implements StoreApi { public class StoreApiServiceImpl implements StoreApi {
public void deleteOrder(String orderId) { public void deleteOrder(String orderId) {
// TODO: Implement... // TODO: Implement...
} }
public Integer getInventory() { public Map<String, Integer> getInventory() {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public Order getOrderById(Long orderId) { public Order getOrderById(Long orderId) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public Order placeOrder(Order body) { public Order placeOrder(Order body) {
// TODO: Implement... // TODO: Implement...
return null; return null;

View File

@ -1,8 +1,8 @@
package io.swagger.api.impl; package io.swagger.api.impl;
import io.swagger.api.*; import io.swagger.api.*;
import io.swagger.model.User;
import java.util.List; import java.util.List;
import io.swagger.model.User;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -18,49 +18,49 @@ import org.apache.cxf.jaxrs.ext.multipart.*;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
public class UserApiServiceImpl implements UserApi { public class UserApiServiceImpl implements UserApi {
public void createUser(User body) { public void createUser(User body) {
// TODO: Implement... // TODO: Implement...
} }
public void createUsersWithArrayInput(List<User> body) { public void createUsersWithArrayInput(List<User> body) {
// TODO: Implement... // TODO: Implement...
} }
public void createUsersWithListInput(List<User> body) { public void createUsersWithListInput(List<User> body) {
// TODO: Implement... // TODO: Implement...
} }
public void deleteUser(String username) { public void deleteUser(String username) {
// TODO: Implement... // TODO: Implement...
} }
public User getUserByName(String username) { public User getUserByName(String username) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public String loginUser(String username, String password) { public String loginUser(String username, String password) {
// TODO: Implement... // TODO: Implement...
return null; return null;
} }
public void logoutUser() { public void logoutUser() {
// TODO: Implement... // TODO: Implement...
} }
public void updateUser(String username, User body) { public void updateUser(String username, User body) {
// TODO: Implement... // TODO: Implement...