2015-09-03 20 views
70

Im di chuyển từ sử dụng Volley sang Retrofit, tôi đã có lớp gson mà tôi đã sử dụng trước đó để chuyển đổi phản hồi JSONObject thành đối tượng triển khai chú thích gson. Khi tôi đang cố gắng để làm cho http được yêu cầu sử dụng trang bị thêm nhưng sau đó bị treo ứng dụng của tôi với lỗi này:Không thể tạo bộ chuyển đổi cho lớp của tôi trong thư viện Android Retrofit

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 

Im sau hướng dẫn trong retrofit trang web và tôi đưa ra những hiện thực:

Đây là của tôi hoạt động mà tôi đang cố gắng để thực hiện yêu cầu 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(); 
     } 

    } 
} 

giao diện của tôi mà quay sang được API của tôi

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

Và cuối cùng là lớp thú nuôi mà nên là phản ứng:

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

vui lòng thêm phản hồi Chuỗi liên kết này http://mysample.com/development/cuteness – koutuk

+0

@koutuk đó chỉ là mẫu, btw i đã thay đổi bài đăng của tôi là –

+0

tại dòng nào bạn gặp phải lỗi .... – koutuk

Trả lời

138

Trước 2.0.0, bộ chuyển đổi mặc định là một chuyển đổi gson, nhưng trong 2.0.0 và sau đó là chuyển đổi mặc định là ResponseBody. Từ các tài liệu:

Theo mặc định, Retrofit chỉ có thể deserialize cơ quan HTTP vào OkHttp của ResponseBody loại và nó chỉ có thể chấp nhận kiểu RequestBody nó cho @Body.

Trong 2.0.0+, bạn cần phải xác định một cách rõ ràng bạn muốn có một chuyển đổi Gson:

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

Bạn cũng sẽ cần phải thêm phụ thuộc sau đây để tập gradle của bạn:

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

Sử dụng cùng một phiên bản cho trình chuyển đổi như bạn làm cho trang bị thêm của bạn. Các trận đấu ở trên phụ thuộc này trang bị thêm:

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

Ngoài ra, lưu ý là các văn bản này, các tài liệu retrofit không được cập nhật hoàn toàn, đó là lý do ví dụ mà có bạn gặp rắc rối. Từ tài liệu:

Lưu ý: Trang web này vẫn đang trong quá trình mở rộng cho API 2.0 mới.

+0

cảm ơn bạn rất nhiều! đó là cái tôi đang tìm kiếm! bởi vì tôi không thể thấy rằng GsonConverterFactory.create() –

+0

tôi vẫn gặp sự cố – user3475052

4

Dựa trên nhận xét đầu tôi cập nhật hàng nhập khẩu của tôi

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

Tôi đã sử dụng http://www.jsonschema2pojo.org/ nhằm tạo của POJO từ kết quả json Spotify và đảm bảo chọn định dạng Gson.

49

Nếu có ai từng gặp vấn đề này trong tương lai vì bạn đang cố xác định nhà máy chuyển đổi tùy chỉnh của riêng mình và gặp phải lỗi này, nó cũng có thể gây ra do có nhiều biến trong một lớp có cùng tên được đăng.IE:

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

Có tên được xác định hai lần (có thể do nhầm lẫn) cũng sẽ ném cùng lỗi chính xác này.

Cập nhật: Hãy nhớ rằng logic này cũng đúng thông qua kế thừa. Nếu bạn mở rộng đến một lớp cha với một đối tượng có cùng tên được nối tiếp như bạn làm trong lớp con, nó sẽ gây ra cùng một vấn đề này.

+6

Người hâm mộ lớn của công việc của bạn :) – StuStirling

+0

Cảm ơn Stu; Tôi chỉ hy vọng một ngày nào đó sẽ bắt kịp các bậc thầy Android như chính bạn! – Silmarilos

+0

Đây là vấn đề đối với tôi, quên xóa một trường bên trong một lớp con mà tôi đã chuyển đến lớp cha. Cảm ơn người đàn ông! – Vucko

0

Trong trường hợp của tôi, tôi đã có một đối tượng TextView bên trong lớp phương thức của tôi và GSON không biết làm thế nào để tuần tự hóa nó. Đánh dấu nó là 'thoáng qua' giải quyết vấn đề.

+0

Trong khi điều này sẽ làm cho nó có thể nhìn thấy, hãy ghi nhớ nó sẽ không hoạt động nếu bạn làm xáo trộn mã (IE, thông qua proguard) và xuất bản nó; tốt hơn là có chú thích SerializedName hoặc Exposed thay thế – Silmarilos

Các vấn đề liên quan