অ্যান্ড্রয়েড রেট্রোফিট লাইব্রেরিতে আমার শ্রেণির জন্য রূপান্তরকারী তৈরি করতে অক্ষম


130

আমি ভলির ব্যবহার থেকে রেট্রোফাইটে স্থানান্তরিত হচ্ছি, আমার কাছে ইতিমধ্যে জিএসএন ক্লাস রয়েছে যা আমি জেএসএনঅবজেক্ট রেপোনসকে এমন একটি বস্তুতে রূপান্তরিত করার জন্য ব্যবহার করেছি যা জিএসন টীকা প্রয়োগ করে। যখন আমি রেট্রোফিট ব্যবহার করে এইচটিসিটির অনুরোধ পাওয়ার চেষ্টা করি তবে আমার অ্যাপটি এই ত্রুটির সাথে ক্র্যাশ হয়:

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

    }
}

আমার ইন্টারফেস যা আমার এপিআই হয়ে গেছে

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

দয়া করে প্রতিক্রিয়া যুক্ত করুন এই লিঙ্কটির স্ট্রিং mysample.com/de
વિકાસ

@ কৌটুক এটি কেবলমাত্র একটি নমুনা, বিটিডব্লিউ আমি ইতিমধ্যে আমার পোস্ট পরিবর্তন করেছি
বিটিডব্লিউ

আপনি কোন লাইনে ত্রুটি পেয়ে যাচ্ছেন ....
যাচ্ছেন

আপনার youtube.com/watch?v=gGuUllmmtPQ এর মধ্য দিয়ে যাওয়া উচিত এই ভিডিওটি
koutuk

ওহ, এটি পুরানো। দর্শন রেট্রোফিট চেষ্টা square.github.io/retrofit
Earwin delos সান্তোসের

উত্তর:


217

এর আগে 2.0.0, ডিফল্ট রূপান্তরকারীটি একটি গসন রূপান্তরকারী ছিল, তবে 2.0.0পরে এবং পরে ডিফল্ট রূপান্তরকারী হয় ResponseBody। ডক্স থেকে:

ডিফল্টরূপে, রিট্রোফিট কেবলমাত্র এইচটিটিপি সংস্থাগুলিকেই OkHttp এর ResponseBodyধরণের ডিজিজারাইজ করতে পারে এবং এটি কেবল এর RequestBodyধরণের জন্য গ্রহণ করতে পারে @Body

ইন 2.0.0+, আপনাকে স্পষ্টভাবে নির্দিষ্ট করতে হবে যে আপনি একটি জিএসন রূপান্তরকারী চান:

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

আপনার গ্রেড ফাইলটিতে আপনাকে নিম্নলিখিত নির্ভরতা যুক্ত করতে হবে:

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

কনভার্টারের জন্য একই সংস্করণটি আপনি যেমন আপনার পুনঃনির্মাণের জন্য করেন তেমন ব্যবহার করুন। উপরোক্ত এই retrofit নির্ভরতা মেলে:

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

এছাড়াও, এটি লেখার মতো নোট করুন, retrofit ডক্স সম্পূর্ণরূপে আপডেট হয় না, এজন্য সেই উদাহরণ আপনাকে সমস্যার মধ্যে ফেলেছে। ডক্স থেকে:

দ্রষ্টব্য: এই সাইটটি এখনও নতুন ২.০ এপিআই-এর জন্য প্রসারিত হওয়ার প্রক্রিয়াধীন রয়েছে।


আমি এখনও ইস্যুটি করছি
ব্যবহারকারী 3475052

217

ভবিষ্যতে যদি কেউ এর আগে কখনও আসেন কারণ আপনি নিজের কাস্টম কনভার্টারের কারখানাটি সংজ্ঞায়িত করার চেষ্টা করছেন এবং এই ত্রুটিটি পাচ্ছেন, এটি ভুল বানানযুক্ত বা একই সিরিয়ালযুক্ত নাম সহ কোনও শ্রেণিতে একাধিক ভেরিয়েবল থাকার কারণেও হতে পারে। অর্থাৎ,

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

সিরিয়ালযুক্ত নাম দু'বার সংজ্ঞায়িত করা (ভুলক্রমে সম্ভবত) এটি একই একই ত্রুটি ছুঁড়ে দেবে।

আপডেট : মনে রাখবেন যে এই যুক্তিটি উত্তরাধিকারের মাধ্যমেও সত্যকে ধারণ করে। আপনি যদি সাব-ক্লাসের মতো একই সিরিয়ালাইজড নামযুক্ত কোনও বস্তুর সাথে কোনও প্যারেন্ট ক্লাসে প্রসারিত করেন তবে এটি একই সমস্যা তৈরি করবে।


2
এটি আমার জন্য সমস্যা ছিল, আমি সন্তানের ক্লাসের ভিতরে এমন একটি ক্ষেত্র সরিয়ে দিতে ভুলে গেছি যা আমি অভিভাবক শ্রেণিতে চলে এসেছি। ধন্যবাদ মানুষ!
ভাকো

1
ধন্যবাদ আপনি আমাকে 2 দিনের লড়াই থেকে বাঁচালেন। একই সিরিয়ালযুক্ত নাম সহ 2 টি ভেরিয়েবল ঘোষণা করে আমিও একই ভুল করেছি।
ভালেন্ক

9

শীর্ষ মন্তব্যের ভিত্তিতে আমি আমার আমদানি আপডেট করেছি

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

স্পটিফাই জসন ফলাফলগুলি থেকে পোজোর তৈরি করতে এবং গসন ফর্ম্যাট নির্দিষ্ট করে দেওয়ার জন্য আমি http://www.jsonschema2pojo.org/ ব্যবহার করেছি ।

এই দিনগুলিতে অ্যান্ড্রয়েড স্টুডিও প্লাগইন রয়েছে যা আপনার জন্য পোজো বা কোটলিন ডেটা মডেল তৈরি করতে পারে। ম্যাকের জন্য একটি দুর্দান্ত বিকল্প হ'ল কুইকটাইপ। https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220


5

কেবল নিশ্চিত হয়ে নিন যে আপনি একই সিরিয়ালটির নামটি দুবার ব্যবহার করছেন না

 @SerializedName("name") val name: String
 @SerializedName("name") val firstName: String

তাদের মধ্যে একটি অপসারণ করুন


ধন্যবাদ, আপনি আমার দিনটি সংরক্ষণ করেছেন :)
হেমেন্দ্র গাঙ্গোয়ার

4

আমার ক্ষেত্রে, আমার মডেল ক্লাসের ভিতরে আমার কাছে একটি টেক্সটভিউ অবজেক্ট ছিল এবং জিএসওএন কীভাবে এটির ক্রমিকায়িত করতে জানত না। এটিকে 'ক্ষণস্থায়ী' হিসাবে চিহ্নিত করা সমস্যার সমাধান করেছে।


এটি এটি দৃশ্যমান করে তুলবে, মনে রাখবেন আপনি কোডটি (IE, অগ্রগতির মাধ্যমে) অবজ্ঞা করে প্রকাশ করলে তা কার্যকর হবে না; এর পরিবর্তে সিরিয়ালাইজড নাম বা এক্সপোজড টিকা দেওয়া ভাল
PGMacDesign

3

@ সিলমারিলোসের পোস্ট আমাকে এটি সমাধান করতে সহায়তা করেছে। আমার ক্ষেত্রে এটি ছিল যে আমি সিরিয়ালযুক্ত নাম হিসাবে "আইডি" ব্যবহার করেছি:

 @SerializedName("id")
var node_id: String? = null

এবং আমি এটি পরিবর্তন

 @SerializedName("node_id")
var node_id: String? = null

সব এখন কাজ। আমি ভুলে গিয়েছিলাম যে 'আইডি' একটি ডিফল্ট বৈশিষ্ট্য।



0

আরে আমি আজ একই সমস্যার মধ্য দিয়ে যাচ্ছিলাম একটি সমাধান খুঁজতে আমাকে পুরো দিন সময় নিয়েছে তবে শেষ পর্যন্ত আমি এটিই খুঁজে পেয়েছি। আমি আমার কোডে ডাগার ব্যবহার করছি এবং আমার পুনঃনির্ধারণের ক্ষেত্রে জিএসন রূপান্তরকারীটি প্রয়োগ করা দরকার।

সুতরাং এটি আমার কোড আগে ছিল

@Provides
    @Singleton
    Retrofit providesRetrofit(Application application,OkHttpClient client) {
        String SERVER_URL=URL;
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl(SERVER_URL);
        return builder
                .client(client)
                .build();
    }

এটিই আমি শেষ করেছি

@Provides
    @Singleton
    Retrofit providesRetrofit(Application application,OkHttpClient client, Gson gson) {
        String SERVER_URL=URL;
        Retrofit.Builder builder = new Retrofit.Builder();
        builder.baseUrl(SERVER_URL);
        return builder
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

প্রথম উদাহরণে কোনও রূপান্তরকারী কীভাবে আছে তা লক্ষ্য করুন এবং সংযোজন যদি আপনি জিএসনকে ইনস্ট্যান্ট না করে থাকেন তবে আপনি এটির মতো এটি যুক্ত করেন

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();

   gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

এবং নিশ্চিত করে নিন যে আপনি এটিকে পুনঃনির্মাণের জন্য পদ্ধতি কলটিতে অন্তর্ভুক্ত করেছেন।

আবার আশা করি এটি আমার মতো কাউকে সাহায্য করবে।


0

আমার ক্ষেত্রে, এটি আমার পরিষেবা দ্বারা অ্যারেলিস্টে ফিরিয়ে দেওয়া একটি তালিকা নেওয়ার চেষ্টা করার কারণে হয়েছিল was সুতরাং আমার যা ছিল তা ছিল:

@Json(name = "items")
private ArrayList<ItemModel> items;

যখন আমার উচিত ছিল

@Json(name = "items")
private List<ItemModel> items;

আশা করি এটি কাউকে সাহায্য করবে!


0

আমার ক্ষেত্রে, সমস্যাটি ছিল যে আমার সুপারক্লাস মডেলটিতে এটির ক্ষেত্রটি নির্ধারিত ছিল। খুব বোকা, আমি জানি ....

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.