Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


No se puede crear un conversor para mi clase en Android Retrofit library

Estoy migrando desde el uso de Volley a Retrofit, ya tengo la clase de gson que usé antes para convertir la respuesta JSONObject a un objeto que implementa las anotaciones de gson. Cuando estoy tratando de hacer http obtener solicitud utilizando retroadaptación, pero luego mi aplicación se bloquea con este error:

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 

Estoy siguiendo la guía en el sitio de reacondicionamiento y llego con estas implementaciones:

Esta es mi actividad donde estoy tratando de ejecutar la solicitud http retro:

 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(); } } } 

Mi interfaz que se convirtió en mi API

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

Y, finalmente, la clase de mascotas que debe ser la respuesta:

 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]; } }; } 

  • No simule ninguna red con Retrofit y MockWebServer
  • Error: tipos incompatibles: GsonConverterFactory no se puede convertir en Factory
  • Cómo ignorar un elemento JSON en Android Retrofit
  • Adaptar la matriz de objetos a GSON Error
  • NoSuchMethodError si estoy usando okhttp 2.0 y la última actualización?
  • Obtención de información de encabezado con RXJava y Retrofit
  • Utilice JsonReader.setLenient (true) para aceptar JSON malformado en la línea 1 de la columna 1 path $
  • GSON ignorar elementos con tipo incorrecto
  • 4 Solutions collect form web for “No se puede crear un conversor para mi clase en Android Retrofit library”

    Antes de 2.0.0 , el convertidor por defecto era un convertidor de gson, pero en 2.0.0 y más adelante el convertidor por defecto es ResponseBody . De los documentos:

    Por defecto, Retrofit sólo puede deserializar cuerpos HTTP en el tipo ResponseBody de OkHttp y sólo puede aceptar su tipo @Body para @Body .

    En 2.0.0+ , debe especificar explícitamente que desea un convertidor Gson:

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

    También necesitará agregar la siguiente dependencia a su archivo gradle:

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

    Utilice la misma versión para el convertidor que usted hace para su retrofit. Lo anterior coincide con esta dependencia de retrofit:

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

    Además, tenga en cuenta que al escribir esto, los documentos de actualización no están completamente actualizados, por lo que ese ejemplo le causó problemas. De los documentos:

    Nota: Este sitio está todavía en proceso de expansión para las nuevas API 2.0.

    Si alguien viene a través de esto en el futuro, ya que está tratando de definir su propia fábrica de convertidor personalizado y están recibiendo este error, también puede ser causada por tener múltiples variables en una clase con el mismo nombre serializado. ES DECIR:

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

    Tener los nombres serializados definidos dos veces (probablemente por error) también lanzará este mismo error.

    Actualización : Tenga en cuenta que esta lógica también es válida a través de la herencia. Si se extiende a una clase padre con un objeto que tiene el mismo nombre Serializado como lo hace en la subclase, provocará el mismo problema.

    Basándome en el comentario superior he actualizado mis importaciones

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

    He utilizado http://www.jsonschema2pojo.org/ para crear pojo de los resultados de Spotify json y asegurarse de especificar el formato Gson.

    En mi caso, tenía un objeto TextView dentro de mi clase modal y GSON no sabía cómo serializarlo. Marcarlo como "transitorio" resolvió el problema.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.