Не удалось создать конвертер для моего класса в Android Retrofit library

Im мигрируя от использования Volley to Retrofit, у меня уже есть класс gson, который я использовал ранее для преобразования ответа JSONObject в объект, который реализует аннотации gson. Когда я пытаюсь заставить http получить запрос с помощью модификации, но затем мое приложение выходит из строя с этой ошибкой:

Unable to start activity ComponentInfo{com.lightbulb.pawesome/com.example.sample.retrofit.SampleActivity}: java.lang.IllegalArgumentException: Unable to create converter for class com.lightbulb.pawesome.model.Pet for method GitHubService.getResponse 

Я следую руководству в модифицированном сайте, и я придумываю эти варианты:

Это моя деятельность, когда я пытаюсь выполнить ретро-запрос http:

 public class SampleActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sample); Retrofit retrofit = new Retrofit.Builder() .baseUrl("**sample base url here**") .build(); GitHubService service = retrofit.create(GitHubService.class); Call<Pet> callPet = service.getResponse("41", "40"); callPet.enqueue(new Callback<Pet>() { @Override public void onResponse(Response<Pet> response) { Log.i("Response", response.toString()); } @Override public void onFailure(Throwable t) { Log.i("Failure", t.toString()); } }); try{ callPet.execute(); } catch (IOException e){ e.printStackTrace(); } } } 

Мой интерфейс, который оказался моим API

 public interface GitHubService { @GET("/ **sample here** /{petId}/{otherPet}") Call<Pet> getResponse(@Path("petId") String userId, @Path("otherPet") String otherPet); } 

И, наконец, класс Pet, который должен быть ответом:

 public class Pet implements Parcelable { public static final String ACTIVE = "1"; public static final String NOT_ACTIVE = "0"; @SerializedName("is_active") @Expose private String isActive; @SerializedName("pet_id") @Expose private String petId; @Expose private String name; @Expose private String gender; @Expose private String age; @Expose private String breed; @SerializedName("profile_picture") @Expose private String profilePicture; @SerializedName("confirmation_status") @Expose private String confirmationStatus; /** * * @return * The confirmationStatus */ public String getConfirmationStatus() { return confirmationStatus; } /** * * @param confirmationStatus * The confirmation_status */ public void setConfirmationStatus(String confirmationStatus) { this.confirmationStatus = confirmationStatus; } /** * * @return * The isActive */ public String getIsActive() { return isActive; } /** * * @param isActive * The is_active */ public void setIsActive(String isActive) { this.isActive = isActive; } /** * * @return * The petId */ public String getPetId() { return petId; } /** * * @param petId * The pet_id */ public void setPetId(String petId) { this.petId = petId; } /** * * @return * The name */ public String getName() { return name; } /** * * @param name * The name */ public void setName(String name) { this.name = name; } /** * * @return * The gender */ public String getGender() { return gender; } /** * * @param gender * The gender */ public void setGender(String gender) { this.gender = gender; } /** * * @return * The age */ public String getAge() { return age; } /** * * @param age * The age */ public void setAge(String age) { this.age = age; } /** * * @return * The breed */ public String getBreed() { return breed; } /** * * @param breed * The breed */ public void setBreed(String breed) { this.breed = breed; } /** * * @return * The profilePicture */ public String getProfilePicture() { return profilePicture; } /** * * @param profilePicture * The profile_picture */ public void setProfilePicture(String profilePicture) { this.profilePicture = profilePicture; } protected Pet(Parcel in) { isActive = in.readString(); petId = in.readString(); name = in.readString(); gender = in.readString(); age = in.readString(); breed = in.readString(); profilePicture = in.readString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(isActive); dest.writeString(petId); dest.writeString(name); dest.writeString(gender); dest.writeString(age); dest.writeString(breed); dest.writeString(profilePicture); } @SuppressWarnings("unused") public static final Parcelable.Creator<Pet> CREATOR = new Parcelable.Creator<Pet>() { @Override public Pet createFromParcel(Parcel in) { return new Pet(in); } @Override public Pet[] newArray(int size) { return new Pet[size]; } }; } 

Solutions Collecting From Web of "Не удалось создать конвертер для моего класса в Android Retrofit library"

До 2.0.0 конвертер по умолчанию был gson-конвертером, но в версии 2.0.0 и более поздней версией был преобразователь ResponseBody . Из документов:

По умолчанию Retrofit может только десериализовать тела HTTP в тип ResponseBody OkHttp, и он может принимать только свой тип @Body для @Body .

В 2.0.0+ вам нужно явно указать, что вы хотите конвертер Gson:

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("**sample base url here**") .addConverterFactory(GsonConverterFactory.create()) .build(); 

Вам также нужно будет добавить следующую зависимость к вашему файлу gradle:

 compile 'com.squareup.retrofit2:converter-gson:2.1.0' 

Используйте ту же версию для конвертера, что и для вашего обновления. Вышеупомянутая соответствует этой зависимой модификации:

 compile ('com.squareup.retrofit2:retrofit:2.1.0') 

Кроме того, обратите внимание на это, обновленные документы не полностью обновлены, поэтому этот пример вызвал у вас проблемы. Из документов:

Примечание. Этот сайт все еще находится в процессе расширения для новых API 2.0.

Если кто-нибудь когда-нибудь столкнется с этим в будущем, потому что вы пытаетесь определить свою собственную фабрику конвертеров и получаете эту ошибку, это также может быть вызвано наличием нескольких переменных в классе с тем же сериализованным именем. IE:

 public class foo { @SerializedName("name") String firstName; @SerializedName("name") String lastName; } 

Сериализованные имена, определенные дважды (вероятно, по ошибке), также будут передавать эту ту же ошибку.

Обновление : Имейте в виду, что эта логика также выполняется через наследование. Если вы переходите к родительскому классу с объектом, который имеет то же имя Serialized, что и в подклассе, это вызовет эту же проблему.

Основываясь на верхнем комментарии, я обновил свой импорт

 compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' 

Я использовал http://www.jsonschema2pojo.org/ , чтобы создать результаты pojo из Spotify json и обязательно указать формат Gson.

В моем случае у меня был объект TextView внутри моего модального класса, и GSON не знал, как его сериализовать. Пометив это как «переходный», проблема решена.