Kotlin方法上使用的Java注释的getAnnotation返回null

时间:2016-10-24 13:48:10

标签: java reflection kotlin spring-data-neo4j spring-annotations

说,我有以下界面:

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 个答案:

答案 0 :(得分:4)

您正在从实现类(即findAll实例的类)加载appRepository上的注释,而不是从接口加载findAll上的注释。要从AppRepository加载注释:

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