Contributions
Generated Java endpoints for array body
I have a following parameter definition in a PATCH request: - name: patch_request in: body required: true schema: $ref: '#/definitions/JSONResourcePatchRequestModel' The object in $ref is the following: JSONResourcePatchRequestModel: type: array items: $ref: '#/definitions/JSONResourcePatchModel' Which is converted as expected into the following model class: public class JSONResourcePatchRequestModel extends ArrayList<JSONResourcePatchModel> implements Serializable{ The API Java method generated by old Swagger looks like this: Response updateConnection(@ApiParam(value = "Fields to update within the connection." ,required=true) JSONResourcePatchRequestModel patchRequest) However the very same swagger.yaml and model definitions when passed through Swagger 3.0 result with a slight change: Response updateConnection(@Parameter(in = ParameterIn.DEFAULT, required=true) List<JSONResourcePatchModel> body) So instead of a class put as a schema ref, we get its base type (the one that it actually extends). My hunch says that that's the cause of the error that occurs when API gets tested: Caused by: java.lang.ClassCastException: java.util.LinkedHashMap incompatible with com.ibm.wdp.connect.common.api.models.JSONResourcePatchModel Apparently the type that's supposed to be there is not exactly the same as expected, Jackson mapper has a problem with proper deserialization of a request so it goes to its fallback which means all the body's JSON content gets mapped into ArrayList<LinkedHashMap> type of the object and it causes the exception. Why the change? Why would this method simply not receive JSONResourcePatchRequestModel type for the body content?508Views0likes1Comment