You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数类型:
    @POST("uploadimage")
    Call<Response> postData(@Header("Cookie") String sessionId, @Body RequestBody image);
    
    构造RequestBody后传入调用:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:02