2015-09-03 2 views
70

मैं वॉली से रेट्रोफिट का उपयोग करने से माइग्रेट कर रहा हूं, मेरे पास पहले से ही जीएसओ क्लास है जिसे मैंने JSONObject reponse को किसी ऑब्जेक्ट में परिवर्तित करने के लिए पहले इस्तेमाल किया था जो जीसन एनोटेशन लागू करता है। जब मैं बनाने के लिए कोशिश कर रहा हूँ 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 

इम retrofit साइट और मैं इन कार्यान्वयन के साथ आने में गाइड निम्नलिखित:

यह मेरा गतिविधि जहाँ मैं रेट्रो 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(); 
     } 

    } 
} 

मेरे इंटरफेस मेरी एपीआई होने के लिए बदल गया जो

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

और अंत में पालतू पशु वर्ग जो प्रतिक्रिया होना चाहिए:

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

कृपया इस लिंक की प्रतिक्रिया स्ट्रिंग जोड़ें http://mysample.com/development/cuteness – koutuk

+0

@ koutuk यह सिर्फ एक नमूना है, btw मैंने अपनी पोस्ट पहले से ही –

+0

बदल दी है जिस लाइन पर आपको त्रुटि मिल रही है .... – koutuk

उत्तर

138

पहले 2.0.0 करने, डिफ़ॉल्ट कनवर्टर एक gson कनवर्टर था, लेकिन 2.0.0 में और बाद में डिफ़ॉल्ट कनवर्टर ResponseBody है। डॉक्स से:

डिफ़ॉल्ट रूप से, रेट्रोफिट केवल OkHttp के ResponseBody प्रकार में HTTP निकायों deserialize कर सकते हैं और यह केवल @Body के लिए अपने RequestBody प्रकार स्वीकार कर सकते हैं।

2.0.0+ में, आप स्पष्ट रूप से आप एक Gson कनवर्टर चाहते हैं निर्दिष्ट करने की आवश्यकता:

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

उपयोग:

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

आप भी अपनी Gradle फ़ाइल में निम्न निर्भरता जोड़ने की आवश्यकता होगी कनवर्टर के लिए एक ही संस्करण जैसा कि आप अपने रेट्रोफिट के लिए करते हैं। ऊपर मैचों इस पुराना वापस निर्भरता:

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

इसके अलावा, टिप्पणी इस लेखन के रूप में, पुराना वापस डॉक्स पूरी तरह से अपडेट नहीं होते हैं, जिसके कारण यह है कि उदाहरण आप मुसीबत में मिला है। दस्तावेज़ों से:

नोट: यह साइट अभी भी नए 2.0 एपीआई के लिए विस्तारित होने की प्रक्रिया में है।

+0

पर जाने का प्रयास करें, आपको बहुत बहुत धन्यवाद! वह वह है जिसे मैं ढूंढ रहा था! क्योंकि मुझे वह GsonConverterFactory.create() –

+0

नहीं मिल रहा है, मुझे अभी भी समस्या है – user3475052

4

शीर्ष टिप्पणी के आधार पर मैं अपने आयात

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

मैं आदेश Spotify json परिणामों से POJO के बनाने के लिए http://www.jsonschema2pojo.org/ उपयोग किया है और Gson प्रारूप निर्दिष्ट करना सुनिश्चित करते अपडेट किया गया।

49

यदि कोई भी भविष्य में इस पर आता है क्योंकि आप अपने स्वयं के कस्टम कनवर्टर फैक्ट्री को परिभाषित करने की कोशिश कर रहे हैं और यह त्रुटि प्राप्त कर रहे हैं, तो यह उसी क्रमबद्ध नाम वाले वर्ग में एकाधिक चर होने के कारण भी हो सकता है।आईई:

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

होने धारावाहिक के नाम दो बार परिभाषित (गलती से होने की संभावना) भी इस में ठीक उसी त्रुटि फेंक देते हैं।

अद्यतन: ध्यान रखें कि यह तर्क विरासत के माध्यम से भी सच है। यदि आप एक ऑब्जेक्ट के साथ अभिभावक वर्ग तक विस्तार करते हैं जिसमें उप-वर्ग में समान सीरियलाइज्ड नाम होता है, तो यह वही समस्या पैदा करेगा।

+6

आपके काम का बड़ा प्रशंसक :) – StuStirling

+0

धन्यवाद स्टू; मैं बस एक दिन एंड्रॉइड मास्टर्स को अपने आप को पकड़ने की उम्मीद कर रहा हूं! – Silmarilos

+0

यह मेरे लिए मुद्दा था, मैं बच्चे वर्ग के अंदर एक फ़ील्ड को हटाने के लिए भूल गया था जिसे मैं मूल वर्ग में ले गया था। धन्यवाद दोस्त! – Vucko

0

मेरे मामले में, मेरे पास मेरे मोडल क्लास के अंदर एक टेक्स्ट व्यू ऑब्जेक्ट था और जीएसओएन को यह नहीं पता था कि इसे कैसे क्रमबद्ध किया जाए। इसे 'क्षणिक' के रूप में चिह्नित करने से इस मुद्दे को हल किया गया।

+0

हालांकि यह इसे दृश्यमान बनाएगा, ध्यान रखें कि यदि आप कोड (आईई, प्रोग्रार्ड के माध्यम से) को खराब करते हैं और इसे प्रकाशित करते हैं तो यह काम नहीं करेगा; इसके बजाय या तो serializedName या उजागर एनोटेशन के लिए बेहतर है – Silmarilos

संबंधित मुद्दे