Retrofit运行报错No Retrofit annotation found.(parameter #3) for callback如何解决
问题解决方案
你不需要给Callback添加任何注解,出现报错是因为你混用了不同版本Retrofit的接口定义规则,且JSONObject类型的请求体没有配置对应的序列化支持,具体修改方案如下:
1. 适配Retrofit版本的接口定义
你当前的接口写法是Retrofit 1.x的用法,如果你用的是现在主流的Retrofit 2.x版本,要求异步调用的接口方法返回Call<T>类型,不需要把Callback作为参数放到接口定义里,修改后的接口如下:
public interface UploadImageRestClient { @POST("uploadimage") Call<Response> postData(@Header("Cookie") String sessionId, @Body JSONObject image); }
对应的调用方式修改为调用enqueue方法传入Callback:
restClient.postData(MapRecintosFragment.sgaUser.getCookieHeader(), json) .enqueue(new Callback<Response>() { @Override public void onResponse(Call<Response> call, Response<Response> response) { // 处理响应逻辑 } @Override public void onFailure(Call<Response> call, Throwable t) { // 处理失败逻辑 } });
如果你确定使用的是Retrofit 1.x版本,只需要配置JSONObject对应的序列化转换器即可,不需要修改接口的Callback参数写法。
2. 解决JSONObject类型的序列化问题
Retrofit默认不会处理org.json.JSONObject类型的请求体序列化,你可以选择两种方案解决:
- 方案A:改用
RequestBody传递JSON内容,无需额外依赖
先修改接口的@Body参数类型:
构造RequestBody后传入调用:@POST("uploadimage") Call<Response> postData(@Header("Cookie") String sessionId, @Body RequestBody image);RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json.toString()); restClient.postData(MapRecintosFragment.sgaUser.getCookieHeader(), body).enqueue(...); - 方案B:改用Java Bean配合Gson转换器(更推荐)
定义和JSON结构对应的Java实体类,添加Gson转换器依赖后,直接用实体类作为@Body参数类型,Retrofit会自动完成序列化,不需要手动构造JSONObject。
内容的提问来源于stack exchange,提问作者user2638180
相关产品推荐
相关产品推荐

