I had a similar issue and I solved it by using a generic Object
and then testing what type of response I had using instanceof
Call<Object> call = api.login(username, password);
call.enqueue(new Callback<Object>()
{
@Override
public void onResponse(Response<Object> response, Retrofit retrofit)
{
if (response.body() instanceof MyPOJO )
{
MyPOJO myObj = (MyPOJO) response.body();
//handle MyPOJO
}
else //must be error object
{
MyError myError = (MyError) response.body();
//handle error object
}
}
@Override
public void onFailure(Throwable t)
{
///Handle failure
}
});
In my case I had either MyPOJO or MyError returned and I could be sure it would be one of these.
In other cases then I had the backend return the same Response Object no matter if the request was successful or not.
Then inside this response object I had my actual data within an “Object” field. Then I can use instance of to determine what type of data I had. In this case I always had the same object being returned, no matter what the call was.
public class MyResponse {
private int responseCode;
private String command;
private int errorno;
private String errorMessage;
private Object responseObject; //This object varies depending on what command was called
private Date responseTime;
}