【问题标题】:Spring Boot + Kotlin annotation error(s)Spring Boot + Kotlin 注释错误
【发布时间】:2017-11-20 20:36:04
【问题描述】:

我有一个用 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)

我在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 spring-annotations spring-webflux


    【解决方案1】:

    kotlin 有自己的 @kotlin.annotation.Retention@kotlin.annotation.Target 注释。请花点时间看看kotlin annotation documentation

    编辑

    我在springframework中测试过没问题。请注意,@Target 在 java 和 kotlin 之间存在区别。

    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;
    

    【讨论】:

    • 我在示例中将它们注释掉,因为这是问题所在:我不能在测试类中使用它们。这可能是Spring(或不是)的问题......我不知道。目前,我正在使用 Java 提供的那些(并收到警告),但我想使用 Kotlin 的......这就是这个问题的重点。
    • @ɐuıɥɔɐɯ 好的。使用 kotlin 注释时你有什么问题?
    • @ɐuıɥɔɐɯ 先生,AnnotationTarget.CLASS 等同于 ElementType.TYPE。所以你应该用 AnnotationTarget.CLASS 替换 AnnotationTarget.TYPE ,它只使用类型用法。
    • ...你是对的!我使用的是相同的“类型”!愚蠢的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2017-05-04
    • 2020-10-02
    相关资源
    最近更新 更多