Дооснащение: как получить имя вызываемого сервисного метода? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть реализация Interceptor, которая добавляет требуемый заголовок к запросу. Время от времени разработчики забывают добавить обязательную аннотацию @Header("foobar") в метод интерфейса сервиса. В этом случае мой Interceptor выбрасывает IllegalArgumentException, указывая отсутствующую аннотацию. К сожалению, в сообщении об исключении не ясно, какой метод службы был вызван. Я хочу предоставить имя метода обслуживания, который был вызван. Это возможно?

Вот мой (котлин) код:

    @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)

1 Ответ

1 голос
/ 03 апреля 2019

После небольшого копания я обнаружил, что retrofit2 внедряет объект вызова в исходный запрос, который должен быть доступен через:

chain.call().request().tag(retrofit2.Invocation.class))

Тег внедряется в retrofit2 в методе RequestFactory.create (Object [] args).

Обратите внимание, это было сделано с Retrofit2 2.5.0, более ранние версии могут отличаться

...