未找到改造注释。 (参数#1)

Posted

技术标签:

【中文标题】未找到改造注释。 (参数#1)【英文标题】:No Retrofit annotation found. (parameter #1) 【发布时间】:2015-04-06 22:07:43 【问题描述】:

我想从带有Retrofit 的 URL 中获取 RSS 代码,如果我在 get 注释中静态输入 url,一切正常,但使用动态 url 时会出错。

我的接口服务:

public interface AllNewsService 
@GET("/fa/rss/url")
void getRss( @Path("url") String nGroup ,  Callback<AllNewsRss> callback);

并调用 getRss 方法:

DataGetter dg = new DataGetter();
    dg.get().getRss("allnews" ,new Callback<AllNewsRss>() 
        @Override
        public void success(AllNewsRss allNewsRss, Response response) 
            Log.d(TAG,"success");
        

        @Override
        public void failure(RetrofitError error) 
            Log.d("*********",error.toString());
        

我收到以下错误:

retrofit.RetrofitError: AllNewsService.getRss: No Retrofit annotation found. (parameter #1)

注意:我在proguard.cfg 中添加了以下行,但它不起作用

-keep class retrofit.**  *; 

【问题讨论】:

您应该验证您的请求代码,所有改造请求注释都应该存在并且格式正确。在此处查看更多信息:readyandroid.wordpress.com/… 【参考方案1】:

我的问题是我有 @POST 注释,但忘记了参数的 @Body 注释。

【讨论】:

不幸的是,这不适用于 /@Query 注释,因为您会收到错误:retrofit.RetrofitError: /@Body 参数不能与表单或多部分编码一起使用。 (参数#1) 天哪,你可以节省时间。多谢,伙计。由于快速发展,我也忘记了那个注释。 @PUT 也有问题【参考方案2】:

除了 Destil 的回答

确保您传递给retrofit interface methods(i.e callbacks, headers, body )parameters 仅属于retrofit package。例如不是您自己想要的自定义回调。

【讨论】:

确保它也属于 right 改造包。就我而言,我不小心从改造而不是改造2中导入了注释【参考方案3】:

还要确保为所有参数添加 @Query@Field,具体取决于您是否发出 GET/POST。

例如:

@GET("/api/Books/GetAll")
void GetRecentBooks(@Query int Offset, Callback<List<Book>> cb);

【讨论】:

【参考方案4】:

我的问题是我正在使用 Kotlin 协程并在 Retrofit GET 方法中使用了“暂停”。只需将其删除,一切正常。

【讨论】:

更准确地说,您应该删除“suspend”关键字。谢谢。 对我不起作用,它说无法创建适配器! 我遇到了同样的问题。那么我们如何在api服务函数上使用suspend呢?【参考方案5】:

为时已晚,但我刚刚遇到了同样的问题。 我在我的改造界面和 viewModel 上使用了带有“延迟”和“等待”的改造 2.5.0。我从改造 github 中读到,从 2.6.0 开始,deferred 已被弃用,我们可以从 deferred 切换到“suspend”。在我将我的改造版本向上移动之前,我只是简单地从延迟更改为暂停并运行它,并得到了同样的错误。我通过将我的改造版本从 2.5.0 移动到 2.6.0 解决了这个问题。

我的观点是,您的应用中的当前改造版本可能不支持您在改造相关的类或接口中使用改造的方式。

【讨论】:

就是这样!从 2.5 更新到 2.6 为我解决了这个问题,谢谢! @waseefakhtar 没问题 :)【参考方案6】:

我有 @Post 注释,但忘记了 @Field@FormUrlEncoded 注释

【讨论】:

【参考方案7】:

你可能忘了先初始化适配器,正如改造 api 中提到的:

RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.github.com")
.build();
GitHubService service = restAdapter.create(GitHubService.class);

http://square.github.io/retrofit/

【讨论】:

【参考方案8】:

(Kotlin)我在这里解决了:

//@FormUrlEncoded // Don't used
@POST("orders")
fun saveOrders(@Body orders: Orders): Call<OrdersResponse>

【讨论】:

您收到错误是因为您忘记在参数中添加@Field 注释并使用了@FormUrlEncoded【参考方案9】:

请检查您正在使用的Path 类,并确保包是retrofit2.http.Path 而不是org.simpleframework.xml.Path。 这是一个常见的 Retrofit 注释错误。

【讨论】:

【参考方案10】:

改造界面中移除所有不属于此的参数。

【讨论】:

【参考方案11】:

就我而言,我使用的是 Retrofit 2.5.0 而不是最新版本。更新到 2.9.0,一切又好了。

【讨论】:

【参考方案12】:

在我的例子中,当我开始使用改造 2 时,我只是忘记删除服务调用的回调参数。确保你没有犯我犯的愚蠢错误。

【讨论】:

【参考方案13】:

忘记加@Field("")

以前的

   @POST("/api/verify-phone")
    @FormUrlEncoded
    fun sendOTP(phone_number: String): Observable<SignInResponse?>

固定

@POST("/api/verify-phone")
@FormUrlEncoded
fun sendOTP(@Field("phone")phone_number: String): Observable<SignInResponse?>

【讨论】:

【参考方案14】:

当我像这样在网络服务接口中使用挂起功能时,发生了这种情况。

interface Service 
    @GET("chapters")
    suspend fun fetchChapters() : List<NetworkChapter>

我通过做两件事解决了这个问题。 1. 使用 Gson 代替 Moshi 库。从改造中移除 moshi 转换器并使用 Gson 转换器。 2. 将协程转换器工厂从改造中移除。我认为这是主要问题。

【讨论】:

我也有同样的问题,你认为主要情况是什么 @YodgorbekKomilov 我需要先查看您的代码,然后才能提出建议 @Gilbert 我已经解决了问题【参考方案15】:

对我来说实际问题是旧的okhttp。即使将改造更新到 2.6.0,也会出现相同的错误。

okhttp_version = "3.12.1"//remove
okhttp_version = "4.4.0"//works

【讨论】:

【参考方案16】:

确保添加所需的所有依赖项:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.5.0'

【讨论】:

【参考方案17】:

在我的例子中,我使用 @Post 和 @body,但是当我使用给定对象而不是参数时使用多个选项而不是一个类,它解决了我的问题

【讨论】:

以上是关于未找到改造注释。 (参数#1)的主要内容,如果未能解决你的问题,请参考以下文章

未找到注释“SqlServer:Include”。确保注释已添加 ASP.Net MVC

未注释的参数覆盖 @NonNull 参数

NoReverseMatch at / 实现注释选项时出错

使用改造的用户名和密码的android注释

Android Studio错误的含义:未注释的参数会覆盖@NonNull参数

未注释的方法覆盖使用@NotNull注释的方法