getAnnotation для аннотации Java, используемой в методе Kotlin, возвращает null

#java #reflection #kotlin #spring-data-neo4j #spring-annotations

#java #отражение #kotlin #spring-data-neo4j #spring-аннотации

Вопрос:

Скажем, у меня есть следующий интерфейс:

 interface AppRepository : GraphRepository<App> {

    @Query("""MATCH (a:App) RETURN a""")
    fun findAll(): List<App>
}
  

В тесте я хочу проверить специфику строки запроса и поэтому я делаю

 open class AppRepositoryTest {

    lateinit @Autowired var appRepository: AppRepository

    @Test
    open fun checkQuery() {
        val productionMethod = appRepository.javaClass.getDeclaredMethod("findAll")
        val productionQuery = productionMethod!!.getAnnotation(Query::class.java)

        //demo test
        assertThat(productionQuery!!.value).isNotEmpty() //KotlinNPE
    }
}
  

По причине, которую я не понимаю, productionQuery равно n null . Я дважды проверил, что типы импортированных Query в тестовом классе и Query в репозитории совпадают.

Таким образом, почему productionQuery null в этом случае?

Ответ №1:

Вы загружаете аннотации на findAll из реализующего класса (т. Е. класса appRepository экземпляра), а не на findAll из интерфейса. Для загрузки аннотаций из AppRepository вместо:

 val productionMethod = AppRepository::class.java.getDeclaredMethod("findAll")
val productionQuery = productionMethod!!.getAnnotation(Query::class.java)
  

Комментарии:

1. черт возьми 🙂 так неловко.