Spring Boot + Kotlin注释错误(s)

我有一个写在Kotlin的Spring Boot 2.0.0.M2 (带WebFlux)应用程序。

我习惯于为测试用例定义/声明“注释”,以避免一些样板配置; 就像是:

 import java.lang.annotation.ElementType import java.lang.annotation.Inherited import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import java.lang.annotation.Target ... @Inherited @Target(ElementType.TYPE) @AutoConfigureWebTestClient // TODO: FTW this really does?! @Retention(RetentionPolicy.RUNTIME) //@kotlin.annotation.Target(AnnotationTarget.TYPE) //@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) @ActiveProfiles(profiles = arrayOf("default", "test")) @ContextConfiguration(classes = arrayOf(Application::class)) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) annotation class SpringWebFluxTest 

…然后在我的测试中,我使用它:

 @SpringWebFluxTest @RunWith(SpringRunner::class) class PersonWorkflowTest { private lateinit var client: WebTestClient ... 

问题是 ,我不能用Kotlin提供的注释来达到同样的效果:

 @kotlin.annotation.Target(AnnotationTarget.TYPE) @kotlin.annotation.Retention(AnnotationRetention.RUNTIME) 

我得到一个this annotation is not applicable to target 'class' PersonWorkflowTest this annotation is not applicable to target 'class' 。 如果我使用Java的一切都很好,但另一方面,我得到这些警告 – 这是我真的想摆脱:)

 ... :compileTestKotlin w: /home/gorre/Workshop/kotlin-spring-boot-reactive/src/test/kotlin/io/shido/annotations/SpringWebFluxTest.kt: (18, 1): This annotation is deprecated in Kotlin. Use '@kotlin.annotation.Target' instead w: /home/gorre/Workshop/kotlin-spring-boot-reactive/src/test/kotlin/io/shido/annotations/SpringWebFluxTest.kt: (20, 1): This annotation is deprecated in Kotlin. Use '@kotlin.annotation.Retention' instead 

Spring Boot的Kotlin注解错误

kotlin拥有自己的@kotlin.annotation.Retention@kotlin.annotation.Target注解。 请花点时间看kotlin注释文件 。

编辑

我已经在springframework中测试过了,没有问题。 请注意,在java和kotlin之间@Target有一个区别。

kotlin kotlin.annotation.@Target(AnnotationTarget.CLASS)被翻译为:

 @java.lang.annotation.Target(ElementType.TYPE); 

和kotlin kotlin.annotation.@Target(AnnotationTarget.TYPE)被翻译成:

 @java.lang.annotation.Target; 

这意味着AnnotationTarget.TYPE不支持Java。 它只用于kotlin。 所以你自己的注释应该是这样的:

 //spring-test annotations @ActiveProfiles(profiles = arrayOf("default", "test")) @ContextConfiguration(classes = arrayOf(Application::class)) //spring-boot annotations @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient //kotlin annotations @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME)// can remove it default is RUNTIME annotation class SpringWebFluxTest; 
Interesting Posts