Я хочу написать Аутентификационный перехватчик, который является токеном доступа загрузки из локальной базы данных и добавить к заголовку запроса в android Проектный компонент компонентов архитектуры .
Класс AuthenticationInterceptor:
class AuthenticationInterceptor: Interceptor, Authenticator {
/*...*/
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
if (!request.url().encodedPath().equals("/login", ignoreCase = true)) {
tokenRepository.getAccessToken().let {
request = request?.newBuilder()
?.addHeader("Authentication", "Bearer " + it)
?.build()
}
}
return chain.proceed(request)
}
override fun authenticate(route: Route, response: Response): Request? {
/*...*/
}
}
Класс AppModule, в котором добавляется перехватчик к OkHttpClient:
@Module(includes = [ViewModelModule::class])
class AppModule {
/*...*/
@Singleton
@Provides
fun provideTokenService(): TokenService {
return Retrofit.Builder()
.client(
OkHttpClient.Builder()
.addNetworkInterceptor(AuthenticationInterceptor()).build()
)
.baseUrl("http://localhost:8080")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(LiveDataCallAdapterFactory())
.build()
.create(TokenService::class.java)
}
/*...*/
}
Я пытаюсь добавить репозиторий в конструктор, но затем приходится вставлять репозиторий в AppModule, что вызывает ошибку сборки
class AuthenticationInterceptor @Inject constructor(val tokenRepository: TokenRepository): Interceptor, Authenticator {
Если я добавлю хранилище в поле класса, тогда хранилище будет нулевым
@Inject lateinit var tokenRepository: TokenRepository
Так что мой вопрос, как внедрить хранилище в перехватчик?