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
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;