Retrofit2调用@GET接口报错:No Retrofit annotation found. (parameter #1)
问题排查与解决方案
嘿,我帮你找到了几个可能触发这个IllegalArgumentException的问题,咱们一步步来解决:
1. OkHttp版本不兼容(最核心的原因)
Retrofit 2.x 完全基于 OkHttp 3.x 构建,但你当前的依赖里引入的是 OkHttp 2.7.0(com.squareup.okhttp:okhttp:2.7.0),这种版本不匹配会导致Retrofit内部无法正确识别@Query这类注解,直接抛出参数注解未找到的异常。
修复方案:
删掉旧的OkHttp 2依赖,替换为Retrofit 2.3.0对应的OkHttp 3版本(比如3.8.1),或者干脆不用手动引入OkHttp——Retrofit会自动依赖兼容的OkHttp3版本:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-compat:27.1.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' // 删掉这行:compile 'com.squareup.okhttp:okhttp:2.7.0' // 可选:手动引入匹配的OkHttp3版本,或者省略让Retrofit自动处理 // compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.android.support:support-core-utils:27.1.1' }
2. Callback泛型缺失(潜在问题)
你在调用enqueue时创建的是new Callback(),但Retrofit 2的Callback必须指定泛型类型,虽然这不是直接引发注解异常的原因,但会导致后续回调里的类型转换错误,建议修正:
result.enqueue(new Callback<Results>() { // 补充泛型<Results> @Override public void onResponse(Call<Results> call, Response<Results> response) { // 建议先判断请求是否成功、响应体是否为空 if (response.isSuccessful() && response.body() != null) { Log.d("data", response.body().toString()); } else { Log.d("data", "请求失败,状态码:" + response.code()); } } @Override public void onFailure(Call<Results> call, Throwable t) { Log.d("data", "请求失败原因:" + t.getMessage()); } });
3. 额外检查项
- 确认
@Query注解的包路径是retrofit2.http.Query,如果不小心导入了旧版Retrofit(1.x)的retrofit.http.Query,也会导致注解不被识别。 - 检查
SEARCHPATH的取值是否为有效的相对路径(比如"search"),不要包含baseUrl里的域名部分,否则会导致URL拼接错误。
内容的提问来源于stack exchange,提问作者user3167555
相关产品推荐
相关产品推荐

