Dagger2无法访问可空。找不到javax.annotation.Nullable

时间:2017-07-08 18:47:16

标签: kotlin retrofit2 dagger-2

我有一个提供Retrofit界面的模块。

simplejson

JSONDecodeError@Module class NetModule(val base: String) { @Provides @Singleton fun provideOkHttpClient(): OkHttpClient { return OkHttpClient.Builder() .addInterceptor(object: Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() info("Request for ${request.url()}") return chain.proceed(request) } }).build() } @Provides @Singleton fun provideGson(): Gson { return GsonBuilder() .enableComplexMapKeySerialization() .serializeNulls() .setPrettyPrinting() .setLenient() .create() } @Provides @Singleton fun provideRetrofit(OkHttpClient: OkHttpClient, Gson: Gson): Retrofit { return Retrofit.Builder() .baseUrl(base) .client(OkHttpClient) .addConverterFactory(GsonConverterFactory.create(Gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync()) .build() } @Provides @Singleton fun provideIdService(Retrofit: Retrofit): IdService { return Retrofit.create(IdService::class.java) } }

一起使用
NetModule

在应用程序中注入并存储在应用程序配套对象中。

NetComponent

在活动中我有

@Singleton
@Component(modules = arrayOf(NetModule::class))
interface NetComponent {

    fun inject(application: Application)

    fun inject(activity: Activity)
}

这会产生构建错误

  如果没有@Provides或@Produces注释方法,则无法提供

netComponent = DaggerNetComponent.builder().netModule(NetModule("some_url")).build() netComponent.inject(this)

如果我尝试注入@Inject lateinit var idService: IdService 实例,我会收到不同的错误

  

无法访问Nullable

stacktrace显示找不到javax.annotation.Nullable的类文件。

我无法找到任何引用此错误的内容。 从12小时前有一个StackOverflow帖子似乎有相同的错误,但它已被删除。 https://stackoverflow.com/questions/44983292/cannot-access-nullable-on-injecting-with-dagger2-in-kotlin

2 个答案:

答案 0 :(得分:8)

我收到了javax.annotation.Nullable not found错误,我可以通过添加包含Nullable注释的findbugs库来解决这个错误。

如果您使用的是gradle,请添加以下依赖项:

implementation 'com.google.code.findbugs:jsr305:3.0.2'

答案 1 :(得分:0)

  

如果没有@Provides或@Produces,则无法提供IdService   注释方法。

这是因为您没有在IdService存在的情况下注入您的依赖项。所以匕首不知道如何提供IdService

  

NetModule用于注入的NetComponent   应用程序并存储在应用程序伴随对象中。

您必须将依赖项注入您希望使用的位置(此处为Activity

所以在你的活动的OnCreate

中写下注射
netComponent = DaggerNetComponent.builder()
        .netModule(NetModule("some_url"))
        .build()
        .inject(this)