java - Retrofit:如何获取被调用服务方法的名称?
问题描述
我有一个Interceptor
向请求添加所需标头的实现。@Header("foobar")
开发人员有时会忘记在服务接口方法中添加所需的注解。在这种情况下,我Interceptor
会抛出一个IllegalArgumentException
指示丢失的注释。不幸的是,在异常消息中并不清楚调用了哪个服务方法。我想提供被调用的服务方法的名称。有可能吗?
这是我的(kotlin)代码:
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val identifier = request.header(REQUIRED_HEADER) ?: run {
val methodName= // how to get the service method name?
throw IllegalArgumentException("Missing annotation >@Header(REQUIRED_HEADER)< on service method: $methodName ")
}
改造它自己可以添加方法名称,以防参数未使用改造注释进行注释。
java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
for method HonkAndFlashFalService.startHonkAndFlash
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:755)
at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:746)
at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:764)
解决方案
经过一番挖掘,我发现retrofit2将一个调用对象注入到原始请求中,应该可以通过以下方式访问:
chain.call().request().tag(retrofit2.Invocation.class))
标签被注入到 RequestFactory.create(Object[] args) 方法中的 retrofit2 中。
请注意,这是使用 retrofit2 2.5.0 完成的,早期版本可能会有所不同
推荐阅读
- r - 在 R 中安装 devtools 的问题
- reactjs - 使用滚动事件问题反应钩子的状态
- angular - Angular Universal 使 mongo db atlas 无法正常工作
- python-3.x - 从控制台获取用户输入的问题
- swift - 尝试将食物对象添加到数组中导致崩溃在展开可选值时意外发现 nil
- python - Python 2.7 路径替换字符串
- java - 为什么我的 main 中的打印输出语句不显示在我的 fillArray 方法中输入的值?
- sql - 多个选择查询合并为一个查询
- python - 为什么单行交换 a,b = b,a 在 Python 中有效?
- c++ - 按位 XOR 与求和之间的性能差异似乎消失了