Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dagger2 cannot access nullable. javax.annotation.Nullable not found

I have a module to provide a Retrofit interface.

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

}

The NetModule is used with NetComponent

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

    fun inject(application: Application)

    fun inject(activity: Activity)
}

Which is injected in the application and stored in the applications companion object.

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

In the Activity I then have

@Inject lateinit var idService: IdService

This gives a build error

IdService cannot be provided without an @Provides or @Produces annotated method.

If I attempt to inject the Retrofit instance instead, I get a different error

cannot access Nullable

The stacktrace shows class file for javax.annotation.Nullable not found.

I haven't been able to find anything referencing this error. There is a StackOverflow post from 12 hours ago which seems to have the same error, but it has been removed. https://stackoverflow.com/questions/44983292/cannot-access-nullable-on-injecting-with-dagger2-in-kotlin

like image 994
Theo Pearson-Bray Avatar asked Jul 08 '17 18:07

Theo Pearson-Bray


1 Answers

I was getting the javax.annotation.Nullable not found error, which I was able to fix by adding in the findbugs library which includes the Nullable annotation.

If you are using gradle add the following dependency:

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

like image 196
jc12 Avatar answered Nov 22 '22 05:11

jc12