NonExistentClass cannot be converted to Annotation

Alfredo Bejarano picture Alfredo Bejarano · Feb 7, 2019 · Viewed 7.6k times · Source

I added a new Retrofit interface to my project containing a couple of Endpoints annotated with the @GET and @HEADERS annotations, after Injecting said interface to a repository class using the @Inject annotation in the constructor of said class, Android Studio throws this error:

NonExistentClass cannot be converted to Annotation

After taking a look at the generated Java code, it replaces the @GET and @HEADERS annotations with this:

@error.NonExistentClass()

I've already tried the following:

  • Using annotatioProcessor instead of kapt

  • Setting jetifier.enabled to false in gradle.properties

  • Setting generateStubs to true in my build.gradle file

  • Setting correctErrorTypes to true in my build.gradle file

Im using:

  • Android Studio 3.3

  • Kotlin 1.3.11

  • Dagger 2.21

  • Retrofit 2.3.0

  • Kotlin

  • Kapt

could it be some dagger scope issue? or Retrofit / dagger not fully compatible with the new versions of the Kapt plugin?

Answer

Daniel Wilson picture Daniel Wilson · Mar 22, 2019

Luckily this question led me to figure out my issue. While moving around classes from an app module into a library, I was referencing an annotation class which only existed in a debug folder. So debug builds were fine, but calls to gradlew install failed when generating release files.

The error for me was very explicit although it took me a long time to realize - the generated file had literally replaced the missing annotation with @error.NonExistentClass()

Moving the file into the main src set meant both debug and release builds could see the class. What took me a while to figure out was that I assumed this was a Dagger issue being masked by kapt, but really it was just a regular old Dagger issue. My advice is to look at your Dagger setup carefully.