Dagger2 генерирует несколько экземпляров модифицированного перехватчика - PullRequest
0 голосов
/ 31 августа 2018

Кинжал 2 генерирует несколько экземпляров модифицированного перехватчика, несмотря на то, что он помечен как одиночный в модуле кинжала. Теперь проблема в том, что конструктор AuthorizationInterceptor вызывается дважды, и я не понимаю, почему, и из-за этого заголовки, которые я устанавливаю после получения результата от API входа в систему, устанавливаются на другой экземпляр Interceptor и при вызове какого-то другого API, который требует authorizationToken токен не установлен.

Вот мой ApiModule

@Module
open class ApiModule {

@Provides
@Singleton
fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
    val loggingInterceptor = HttpLoggingInterceptor()
    loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
    return loggingInterceptor
}

@Provides
@Singleton
fun provideHeaderInterceptor(): Interceptor {
    return AuthorizationInterceptor()
}

@Provides
@Singleton
fun provideHttpClient(interceptor: HttpLoggingInterceptor, headerInterceptor: Interceptor): OkHttpClient {
    return OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .addInterceptor(headerInterceptor)
            .build()
}

@Provides
@Singleton
fun provideMoshi(): Moshi {
    return Moshi.Builder()
            .build()
}

@Provides
@Singleton
fun provideRetrofit(client: OkHttpClient, moshi: Moshi, apiConfig: ApiConfig): Retrofit {
    return Retrofit.Builder()
            .baseUrl(apiConfig.baseUrl)
            .client(client)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build()
}

@Provides
@Singleton
fun provideFrappApi(retrofit: Retrofit): FrappApi {
    return retrofit.create(FrappApi::class.java)
}

Вот мой класс AuthorizationInterceptor

@Singleton
class AuthorizationInterceptor @Inject constructor() : Interceptor {

override fun intercept(chain: Interceptor.Chain?): Response {
    val request = chain?.request()
    val requestBuilder = request?.newBuilder()
    if (request?.header("No-Authorization") == null && authorization.isNotEmpty()) {
        requestBuilder?.addHeader("Authorization", authorization)
    }
    return chain?.proceed(requestBuilder!!.build())!!
}

private var authorization: String = ""
fun setSessionToken(sessionToken: String) {
    this.authorization = sessionToken
}
}

1 Ответ

0 голосов
/ 31 августа 2018

Вам не нужно создавать метод обеспечить, если вы делаете инъекцию в конструктор.

Удалите метод provideHeaderInterceptor, затем обновите метод provideHttpClient, как показано ниже,

@Provides
@Singleton
fun provideHttpClient(interceptor: HttpLoggingInterceptor,
        headerInterceptor: AuthorizationInterceptor): OkHttpClient {

    return OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .addInterceptor(headerInterceptor)
        .build()
}

Или, если вам не нравится вышеприведенное решение, вы можете удалить @Singleton и @Inject в вашем AuthorizationInterceptor классе.

...