Android Retrofit 라이브러리에서 클래스의 변환기를 만들 수 없습니다.
발리를 사용하는 것에서 레트로핏으로 마이그레이션하고 있는데, 이전에 JSONObject 응답을 gson 주석을 구현하는 객체로 변환할 때 사용했던 gson 클래스가 이미 있습니다.retrofit을 사용하여 http get request를 하려고 하는데 다음 오류와 함께 앱이 충돌하는 경우:
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
저는 개조 현장의 가이드를 따르고 있으며 다음과 같은 구현 방법을 생각해냅니다.
retro 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);
}
마지막으로 펫 클래스를 선택하면 다음과 같은 반응을 얻을 수 있습니다.
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];
}
};
}
사용자 지정 변환기 팩토리를 정의하려고 하는데 이 오류가 발생하는 경우, 철자가 잘못되었거나 동일한 일련 이름을 가진 클래스에 여러 변수가 있는 것이 원인일 수도 있습니다.IE:
(자바)
public class foo {
@SerializedName("name")
String firstName;
@SerializedName("name")
String lastName;
}
(코틀린)
@SerializedName("name") val firstName: String
@SerializedName("name") val lastName: String
연속된 이름을 두 번 정의하면(실수로 정의되었을 가능성이 높음) 이 오류도 똑같이 발생합니다.
업데이트: 이 논리는 상속을 통해서도 성립됩니다.하위 클래스와 동일한 Serialized 이름을 가진 개체를 가진 상위 클래스로 확장하면 이와 같은 문제가 발생합니다.
이전2.0.0
, 기본 변환기는 agson 변환기였지만,2.0.0
나중에 기본 변환기는ResponseBody
문서에서:
기본적으로 Retrofit은 HTTP 본문을 OkHttp의 것으로만 병렬화할 수 있습니다.
ResponseBody
type 그리고 그것은 오직 그것을 받아들일 수 있습니다.RequestBody
타자를 치다@Body
.
2.0.0+
, Gson 변환기를 사용할 것을 명시적으로 지정해야 합니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("**sample base url here**")
.addConverterFactory(GsonConverterFactory.create())
.build();
그라들 파일에 다음 종속성도 추가해야 합니다.
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
개조할 때와 동일한 버전을 컨버터에 사용합니다.위의 내용이 이 레트로핏 종속성과 일치합니다.
compile ('com.squareup.retrofit2:retrofit:2.1.0')
또한, 이 글을 쓰는 현재, 개조된 문서들이 완전히 업데이트되지 않았기 때문에 이 예시가 당신을 곤경에 빠뜨린 것입니다.문서에서:
참고: 이 사이트는 새로운 2.0 API를 위해 아직 확장 중입니다.
동일한 직렬화 이름을 두 번 사용하지 않는지 확인합니다.
@SerializedName("name") val name: String
@SerializedName("name") val firstName: String
그 중 하나만 제거하면 됩니다.
주요 의견을 바탕으로 수입품을 업데이트했습니다.
implementation 'com.squareup.retrofit2:retrofit:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
저는 스포티파이 json 결과에서 pojo를 만들고 Gson 형식을 지정하기 위해 http://www.jsonschema2pojo.org/ 을 사용했습니다.
요즘은 안드로이드 스튜디오 플러그인을 사용하여 포조나 코틀린 데이터 모델을 만들 수 있습니다.맥의 좋은 옵션 중 하나는 Quicktype입니다.https://itunes.apple.com/us/app/paste-json-as-code-quicktype/id1330801220
제 경우는 레트로핏 2.0을 탑재한 Moshi 라이브러리를 사용하고 있었습니다.
// Moshi
implementation 'com.squareup.moshi:moshi-kotlin:1.9.3'
// Retrofit with Moshi Converter
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
커스텀 Moshi json 컨버터 어댑터 팩토리 오브젝트를 Moshi 컨버터 팩토리 컨스트럭터에 전달하는 것을 잊었습니다.
private val moshi = Moshi.Builder() // adapter
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create()) // <- missing moshi json adapter insance
.baseUrl(BASE_URL)
.build()
수정:.addConverterFactory(MoshiConverterFactory.create(moshi))
저의 경우, 제 모달 클래스 안에 TextView 객체가 있었는데 GSON은 그것을 직렬화하는 방법을 몰랐습니다.'일시적'으로 표시하면 문제가 해결됩니다.
@실마릴로스가 올린 글이 이를 해결하는 데 도움이 됐습니다.저 같은 경우는 'id'를 연작명으로 사용한 것인데요, 다음과 같습니다.
@SerializedName("id")
var node_id: String? = null
로 바꿨습니다.
@SerializedName("node_id")
var node_id: String? = null
이제 다 됩니다.저는 'id'가 기본 속성이라는 것을 잊었습니다.
제 경우에는 서비스에서 반환되는 목록을 배열 목록으로 가져가려고 했기 때문입니다.그래서 제가 가진 것은
@Json(name = "items")
private ArrayList<ItemModel> items;
내가 했어야 할 시간에
@Json(name = "items")
private List<ItemModel> items;
누군가에게 도움이 되길 바랍니다!
누군가에게 도움이 될 수도 있습니다.
제 경우 실수로 시리얼라이즈드 네임을 이렇게 썼습니다.
@SerializedName("name","time")
String name,time;
그럴 것 같네요.
@SerializedName("name")
String name;
@SerializedName("time")
String time;
저의 경우 SUPERCLASS 모델에 이 필드가 정의되어 있는 것이 문제였습니다.아주 바보같군요, 알아요...
인build.gradle
변화하는
minifyEnabled true
로.
minifyEnabled false
제 문제를 해결했습니다.
나의 경우는kotlinx.serialization
, 동일한 예외가 복고로 인해 제기되었습니다.
그것은 행방불명 때문이었습니다.@Serializable
주석.
@Serializable
data class MyClass(
val id: String
)
제 경우엔 제가 그 일을 놓쳤거든요Serialization
기여하다.
추가할 수 밖에 없었습니다.@kotlinx.serialization.Serializable
모든 데이터 클래스 전에:
@kotlinx.serialization.Serializable
data class RadioSearchPodcastDto(
val playables: List<Playable>,
val searchTag: SearchTag,
val totalCount: Int
)
레트로핏 인터페이스:
interface PodcastRadioApi {
@GET("/podcasts/search")
suspend fun getPodcastBySearch(@Query("query") query: String,
@Query("count") count: Int,
@Query("offset") offset: Int,
@Query("partner") partner: String): RadioSearchPodcastDto
}
모두, 메인 클래스와 모든 서브 클래스(Playable, SearchTag, ...)를 의미합니다.
안녕하세요. 오늘 같은 문제를 겪고 있었는데 해결책을 찾는 데 꼬박 하루가 걸렸지만 이것이 마침내 찾은 해결책입니다.내 코드에 Daggar를 사용하고 있으며 개조 인스턴스에 Gson 변환기를 구현해야 했습니다.
전엔 이게 내 암호였군요
@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();
}
첫번째 예에 컨버터가 없고 Gson을 인스턴스화하지 않았다면 이렇게 추가할 수 있습니다. 이렇게 추가합니다.
@Provides
@Singleton
Gson provideGson() {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return gsonBuilder.create();
}
그리고 당신이 그것을 개조를 위한 메소드 콜에 포함시켰는지 확인합니다.
이것이 나 같은 사람에게 도움이 되기를 다시 한번 바랍니다.
제 경우에는 ConverterFactory를 Moshi에서 Gson으로 변경해야 했고 그것은 의지가 되었습니다.
.addConverterFactory(GsonConverterFactory.create())
제 경우에는 그랬습니다.@XNullable
태그. 제대로 처리되지 않았습니다.
저는 moshi를 사용하는데 저의 경우 @JsonClass 주석이 빠져있었습니다.
@JsonClass(generateAdapter = true)
data class Response (
val summary: String?
)
디버깅을 개선하기 위해 추가 옵션을 사용했습니다..asLenient()
MoshiConverterFactory.create(moshi)
,예MoshiConverterFactory.create(moshi).asLenient()
그리고 logcat에서 원인을 알 수 있었습니다.
제 프로젝트에서는 무엇이 잘못된 것인지를 보여주었습니다.
Caused by: java.lang.IllegalArgumentException:
Platform class java.sql.Time (with no annotations)
requires explicit JsonAdapter to be registered
for class java.sql.Time finishTime
나는 다음과 같은 클래스를 정의했습니다.Time finishTime
소유물. 일시적으로 "String"으로 종류를 변경했는데오류가 사라졌습니다.일시적으로 "String"으로 종류를 변경했는데 오류가 사라졌습니다.
제 경우에는 제가 사용하고 있습니다.Moshi
와 함께Retrofit
그리고 내 실수는:
나는 a를 정의하지 않았습니다.body
포함하는 대상에 대해Response
강습회
예를 들어 다음과 같습니다.
@JsonSerializable
data class Balance(
@field:Json(name = "balance") var balance: Double,
@field:Json(name = "currency") var currency: Currency
그리고.Currency
수업이 비었습니다.그래서 완성하고 문제를 해결했습니다!
언급URL : https://stackoverflow.com/questions/32367469/unable-to-create-converter-for-my-class-in-android-retrofit-library
'programing' 카테고리의 다른 글
관계 열은 어디서 같습니까? (0) | 2023.10.23 |
---|---|
클릭시 이 요소를 자바스크립트로 전달하고 클릭한 요소에 클래스를 추가하는 방법 (0) | 2023.10.23 |
uitabbar controller 숨김 방법 (0) | 2023.10.23 |
사이트가 주기적으로 중단되고 "Myql connect error [localhost]: (2002) Connection rejected (400)" 오류가 발생합니다. (0) | 2023.10.23 |
크기 8 - Valgrind + C의 잘못된 판독값 (0) | 2023.10.23 |