Как правильно использовать связку Dagger и Kotlin Serialization
Изучаю как работает даггер и тут возникла проблема, в связке с kotlin serialization он выдает такую ошибку:
java.lang.IllegalArgumentException: Unable to create converter for java.util.List<com.example.testdaggerapplication.model.Photo>
Все заведомо рабочее, потому что по сути переношу с ручного DI на даггер, и маппинг даггера тоже правильный, потому что с GsonConverterFactory.create(GsonBuilder().create()) все работает
Всю голову себе сломал не понимаю почему он не может создать конвертер kotlin serialization ниже представлю код модуля подключения к сети
@Module
class NetworkModule {
companion object{
private const val BASE_URL = "https://android-kotlin-fun-mars-server.appspot.com/"
private val CONVERTER_FACTORY = Json{ignoreUnknownKeys = true}.asConverterFactory("application/json".toMediaType())
}
//@Binds
//fun provideNetworkConnection(){}
@Provides
fun provideRetrofit(): Retrofit =
Retrofit.Builder()
.baseUrl(BASE_URL)
//.addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
//.addConverterFactory(CONVERTER_FACTORY)
.addConverterFactory(Json{ignoreUnknownKeys = true}.asConverterFactory("application/json".toMediaType()))
.build()
@Provides
fun provideMarsService(retrofit: Retrofit):MarsPhotosService =
retrofit.create(MarsPhotosService::class.java)
}
@Serializable
data class Photo(
@SerialName("id")
val userID: String,
@SerialName("img_src")
val imgUrl:String
)
Ну и весь стектрейс
FATAL EXCEPTION: main
Process: com.example.testdaggerapplication, PID: 19700
java.lang.IllegalArgumentException: Unable to create converter for java.util.List<com.example.testdaggerapplication.model.Photo>
for method MarsPhotosService.getPhotos
at retrofit2.Utils.methodError(Utils.java:54)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:126)
at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:85)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy2.getPhotos(Unknown Source)
at com.example.testdaggerapplication.repository.PhotosRepositoryImpl.getPhotos(PhotosRepositoryImpl.kt:10)
at com.example.testdaggerapplication.domain.UseCase.execute(UseCase.kt:12)
at com.example.testdaggerapplication.viewmodel.PhotosViewModel$getPhotos$1.invokeSuspend(PhotosViewModel.kt:24)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:367)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
at kotlinx.coroutines.BuildersKt.launch(Unknown Source:1)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source:1)
at com.example.testdaggerapplication.viewmodel.PhotosViewModel.getPhotos(PhotosViewModel.kt:23)
at com.example.testdaggerapplication.viewmodel.PhotosViewModel.<init>(PhotosViewModel.kt:19)
at com.example.testdaggerapplication.di.DaggerAppComponent$AppComponentImpl.photosViewModel(DaggerAppComponent.java:60)
at com.example.testdaggerapplication.di.DaggerAppComponent$AppComponentImpl.injectMainActivity(DaggerAppComponent.java:69)
at com.example.testdaggerapplication.di.DaggerAppComponent$AppComponentImpl.inject(DaggerAppComponent.java:65)
at com.example.testdaggerapplication.MainActivity.onCreate(MainActivity.kt:17)
at android.app.Activity.performCreate(Activity.java:8657)
at android.app.Activity.performCreate(Activity.java:8636)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4165)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4340)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2584)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@fe3b300, Dispatchers.Main.immediate]
Caused by: kotlinx.serialization.SerializationException: Serializer for class 'Photo' is not found.
Please ensure that class is marked as "@Serializable" and that the serialization compiler plugin is applied.
2023-11-14 01:44:49.273 19700-19700 AndroidRuntime
com.example.testdaggerapplication
E at kotlinx.serialization.internal.PlatformKt.serializerNotRegistered(Platform.kt:31)
at kotlinx.serialization.SerializersKt__SerializersJvmKt.serializer(SerializersJvm.kt:77)
at kotlinx.serialization.SerializersKt.serializer(Unknown Source:1)
at kotlinx.serialization.SerializersKt__SerializersJvmKt.serializerByJavaTypeImpl$SerializersKt__SerializersJvmKt(SerializersJvm.kt:113)
at kotlinx.serialization.SerializersKt__SerializersJvmKt.serializer(SerializersJvm.kt:76)
at kotlinx.serialization.SerializersKt.serializer(Unknown Source:1)
at com.jakewharton.retrofit2.converter.kotlinx.serialization.Serializer.serializer(Serializer.kt:21)
at com.jakewharton.retrofit2.converter.kotlinx.serialization.Factory.responseBodyConverter(Factory.kt:26)
at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:362)
at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:345)
at retrofit2.HttpServiceMethod.createResponseConverter(HttpServiceMethod.java:124)
... 41 more
Репозиторий: https://github.com/RMVL-dev/DaggerTestApp.git