简体   繁体   English

使用Retrofit2和Kotlin将数据发布到正文中:无法创建呼叫适配器

[英]Post data in body with Retrofit2 and Kotlin: Unable to create call adapter

we have the problem to send a post request with body parameters. 我们在发送带有正文参数的发布请求时遇到了问题。 The JSON looks like: JSON看起来像:

{
"userId": 123456,
"comment": "This is a comment"
}

We call the backend with the following interface: 我们通过以下接口调用后端:

interface ServiceDetailsService {

   @POST(API_CLOSE_EVENT)
   fun closeEvent(@Body data: servicePostData): Call<servicePostData>
}

We call the function with: 我们使用以下函数调用该函数:

fun serviceTaskDone(data: servicePostData) {
       val call: Call<servicePostData> = service.closeEvent(data)
       call.enqueue(object : Callback<servicePostData> {
           override fun onResponse(call: Call<servicePostData>, response: Response<servicePostData>) {
               Log.d("Output", response.toString())
           }

           override fun onFailure(call: Call<servicePostData>, t: Throwable) {
               Log.d("Output", t.toString())
           }

       })
   }

And when we now execute our code the following errors will come up: 当我们现在执行代码时,将出现以下错误:

11-15 18:40:23.732 23168-23168/de.conlance.shannonapp E/AndroidRuntime: FATAL EXCEPTION: main
   Process: de.conlance.shannonapp, PID: 23168
   java.lang.IllegalArgumentException: Unable to create call adapter for retrofit2.Call<de.conlance.shannonapp.data.model.serviceDetails.Task>
       for method ServiceDetailsService.closeEvent
       at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:755)
       at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:240)
       at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:165)
       at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
       at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
       at java.lang.reflect.Proxy.invoke(Proxy.java:913)
       at $Proxy3.closeEvent(Unknown Source)
       at de.conlance.shannonapp.presentation.serviceDetails.ServiceDetailsViewModel.serviceTaskDone(ServiceDetailsViewModel.kt:37)
       at de.conlance.shannonapp.presentation.serviceDetails.ServiceDetailsFragment$showAcceptErrorDescDialog$1.onClick(ServiceDetailsFragment.kt:171)
       at android.view.View.performClick(View.java:6274)
       at android.view.View$PerformClick.run(View.java:24859)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6710)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
    Caused by: kotlin.TypeCastException: null cannot be cast to non-null type retrofit2.CallAdapter<kotlin.Any, kotlin.Any>
       at de.conlance.shannonapp.rx.RetrofitRxErrorHandlingCallAdapterFactory.get(RetrofitRxErrorHandlingCallAdapterFactory.kt:41)
       at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:221)
       at retrofit2.Retrofit.callAdapter(Retrofit.java:205)
       at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:238)
       at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:165)
       at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170)
       at retrofit2.Retrofit$1.invoke(Retrofit.java:147)
       at java.lang.reflect.Proxy.invoke(Proxy.java:913)
       at $Proxy3.closeEvent(Unknown Source)
       at de.conlance.shannonapp.presentation.serviceDetails.ServiceDetailsViewModel.serviceTaskDone(ServiceDetailsViewModel.kt:37)
       at de.conlance.shannonapp.presentation.serviceDetails.ServiceDetailsFragment$showAcceptErrorDescDialog$1.onClick(ServiceDetailsFragment.kt:171)
       at android.view.View.performClick(View.java:6274)
       at android.view.View$PerformClick.run(View.java:24859)
       at android.os.Handler.handleCallback(Handler.java:789)
       at android.os.Handler.dispatchMessage(Handler.java:98)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6710)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

We have tested with a Void-Parameter in the Call and we get also the same error message as below. 我们已经在Call中对Void参数进行了测试,并且还收到了以下相同的错误消息。

For any suggestion we are very grateful. 对于任何建议,我们非常感谢。

Best regards 最好的祝福

there is something annotated with @NonNull , while it gets NULL passed into: @NonNull注释了@NonNull ,同时将NULL传递给了:

Caused by: kotlin.TypeCastException: null cannot be cast to non-null type retrofit2.CallAdapter at de.conlance.shannonapp.rx.RetrofitRxErrorHandlingCallAdapterFactory. 由以下原因引起:kotlin.TypeCastException: 无法在de.conlance.shannonapp.rx.RetrofitRxErrorHandlingCallAdapterFactory上将null强制转换为非null类型 retrofit2.CallAdapter。 get(RetrofitRxErrorHandlingCallAdapterFactory.kt:41) get(RetrofitRxErrorHandlingCallAdapterFactory.kt:41)

calling it request or api instead of call would make it more readable ( call might even clash). 调用它requestapi而不是call会使其更具可读性( call甚至可能发生冲突)。

@martin-zeitler we have fixed the problem. @ martin-zeitler我们已解决问题。

  1. We added the following header 我们添加了以下标题

@Headers("Content-Type: application/json; charset=urf-8") @Headers(“ Content-Type:application / json; charset = urf-8”)

  1. We added the compositDisposable like 我们添加了compositDisposable之类的

    compositDisposable.add(service.closeEvent(jsonObject.toString()) compositDisposable.add(service.closeEvent(jsonObject.toString())

     .compose(RxSingleCallback.getSchedulersForSingle()) .doOnSubscribe{ loadingStatusMutable.value = true } .doAfterTerminate { loadingStatusMutable.value = false } .subscribeWith(object : DisposableSingleObserver<ServicePostResponse>() { override fun onSuccess(response: ServicePostResponse) { Log.d("Response", response.toString()) } override fun onError(t: Throwable) { Log.d("Response", t.toString()) //snackBarMutable.value = throwable.localizedMessage } }) 

    )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM