Spring Boot + Kotlin注释错误

时间:2017-06-18 15:54:15

标签: spring-boot kotlin spring-annotations spring-webflux

我有一个用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。如果我使用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 Annotation(s) error with Spring Boot

1 个答案:

答案 0 :(得分:1)

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;

这意味着java不支持AnnotationTarget.TYPE。它只是用于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;