无法为类示例创建调用适配器。简单

2022-08-31 07:41:09

我正在使用带有SimpleXml的redelition 2.0.0-beta1。我想要从 REST 服务检索简单 (XML) 资源。使用 SimpleXML 编组/取消编组 Simple 对象工作正常。

使用此代码时(转换后的格式 2.0.0 之前的代码):

final Retrofit rest = new Retrofit.Builder()
    .addConverterFactory(SimpleXmlConverterFactory.create())
    .baseUrl(endpoint)
    .build();
SimpleService service = rest.create(SimpleService.class);
LOG.info(service.getSimple("572642"));

服务:

public interface SimpleService {

    @GET("/simple/{id}")
    Simple getSimple(@Path("id") String id);

}

我得到这个例外:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to create call adapter for class example.Simple
    for method SimpleService.getSimple
    at retrofit.Utils.methodError(Utils.java:201)
    at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:51)
    at retrofit.MethodHandler.create(MethodHandler.java:30)
    at retrofit.Retrofit.loadMethodHandler(Retrofit.java:138)
    at retrofit.Retrofit$1.invoke(Retrofit.java:127)
    at com.sun.proxy.$Proxy0.getSimple(Unknown Source)

我错过了什么?我知道用一个作品包装返回类型。但我希望服务将业务对象作为类型返回(并在同步模式下工作)。Call

更新

添加额外的依赖项后,如不同答案所建议的那样,我仍然收到此错误:.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class simple.Simple. Tried:
 * retrofit.RxJavaCallAdapterFactory
 * retrofit.DefaultCallAdapter$1

答案 1

Kotlin协程的情况下,当我忘记将api服务函数标记为当我从中调用此函数时,就会发生这种情况:suspendCoroutineScope(Dispatchers.IO).launch{}

用法:

    val apiService = RetrofitFactory.makeRetrofitService()

    CoroutineScope(Dispatchers.IO).launch {

        val response = apiService.myGetRequest()

        // process response...

    }

ApiService.kt

interface ApiService {

       @GET("/my-get-request")
       suspend fun myGetRequest(): Response<String>
}

答案 2

简短的回答:在服务接口中返回 Call<Simple>

看起来Retrofit 2.0正在尝试找到一种为服务接口创建代理对象的方法。它希望你这样写:

public interface SimpleService {
    @GET("/simple/{id}")
    Call<Simple> getSimple(@Path("id") String id);
}

但是,当您不想返回.为了支持这一点,它具有CallAdapter的概念,它应该知道如何将a改编成.CallCall<Simple>Simple

仅当尝试返回 时才使用 。RxJavaCallAdapterFactoryrx.Observable<Simple>

最简单的解决方案是按照改造的预期返回。如果你真的需要,你也可以写一个CallAdapter.FactoryCall