Spring 引导 + Kotlin 注释错误
Spring Boot + Kotlin annotation error(s)
我有一个用 Kotlin 编写的 Spring Boot 2.0.0.M2
(使用 WebFlux)应用程序。
我习惯于 define/declare "annotations" 测试用例以避免一些样板配置;类似于:
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)
我在 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 annotation documentation。
编辑
我在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。它只是在科特林中使用。所以你自己的注释应该是这样的:
//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;
我有一个用 Kotlin 编写的 Spring Boot 2.0.0.M2
(使用 WebFlux)应用程序。
我习惯于 define/declare "annotations" 测试用例以避免一些样板配置;类似于:
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)
我在 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 annotation documentation。
编辑
我在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。它只是在科特林中使用。所以你自己的注释应该是这样的:
//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;