#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. черт возьми 🙂 так неловко.