I am using retrofit 2.0.0-beta1 with SimpleXml. I want the retrieve a Simple (XML) resource from a REST service. Marshalling/Unmarshalling the Simple object with SimpleXML works fine.
When using this code (converted form pre 2.0.0 code):
final Retrofit rest = new Retrofit.Builder()
.addConverterFactory(SimpleXmlConverterFactory.create())
.baseUrl(endpoint)
.build();
SimpleService service = rest.create(SimpleService.class);
LOG.info(service.getSimple("572642"));
Service:
public interface SimpleService {
@GET("/simple/{id}")
Simple getSimple(@Path("id") String id);
}
I get this exception:
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)
What am i missing? I know that wrapping the return type by a Call
works. But I want the service to return business objects as type (and working in sync mode).
UPDATE
After added the extra dependancies and .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
as suggested by different answers, I still get this error:
Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class simple.Simple. Tried:
* retrofit.RxJavaCallAdapterFactory
* retrofit.DefaultCallAdapter$1
Short answer: return
Call<Simple>
in your service interface.It looks like Retrofit 2.0 is trying to find a way of creating the proxy object for your service interface. It expects you to write this:
However, it still wants to play nice and be flexible when you don't want to return a
Call
. To support this, it has the concept of aCallAdapter
, which is supposed to know how to adapt aCall<Simple>
into aSimple
.The use of
RxJavaCallAdapterFactory
is only useful if you are trying to returnrx.Observable<Simple>
.The simplest solution is to return a
Call
as Retrofit expects. You could also write aCallAdapter.Factory
if you really need it.IllegalArgumentException: Unable to create call adapter for class java.lang.Object
Short answer: I have solved it by the following changes
Good luck
in my case using this
with this
solved the problem when nothing else worked
In my case I used
instead of
you should be using
com.squareup.retrofit2:adapter-rxjava2:2.5.0
when usingio.reactivex.rxjava2
The way I fixed this issue was adding this to the application gradle file, if the configuration is not set there will be conflicts, maybe this will be fixed in the stable release of the library:
and create your adapter this way:
Hope it helps!
In case of Kotlin and coroutines this situation happened when I forgot to mark api service function as
suspend
when I call this function fromCoroutineScope(Dispatchers.IO).launch{}
:Usage:
ApiService.kt