Kotlin 编译器抱怨在属性定义中使用 SPeL 表达式。为啥?

Posted

技术标签:

【中文标题】Kotlin 编译器抱怨在属性定义中使用 SPeL 表达式。为啥?【英文标题】:Kotlin compiler complains about using a SPeL expression in a property definition. WHY?Kotlin 编译器抱怨在属性定义中使用 SPeL 表达式。为什么? 【发布时间】:2017-11-14 08:41:34 【问题描述】:

当我尝试使用 SPeL 表达式注入一个值时,它在 Java 中有效,但在 Kotlin 中无效。编译器说

Error:(13, 25) Kotlin: An annotation parameter must be a compile-time constant

代码:

@SpringBootApplication
open class DeDup(@Value("#new java.io.File('$roots')") val roots: Set<File>,
                 @Value("algo") val hashAlgo: String,
                 @Value("types")val fileTypes: List<String>) 



fun main(args: Array<String>) 
 SpringApplication.run(DeDup::class.java, *args)

嗯...新闻快讯 Kotlin 编译器:它是一个常量!编译器清楚地知道它是一个 SPeL 表达式并且不喜欢它。

我的问题:

    为什么 Kotlin 不喜欢 SPeL?这是一个构造注入(或者是它)并且不违反不变性。

    这是编译器错误吗?消息无疑是错误的。

【问题讨论】:

【参考方案1】:

在 Kotlin 中的字符串中的$roots 是string template,因此该字符串不是常量。

如果您希望字符串包含这些实际字符而不被解释为模板,则必须转义 $:

@Value("#new java.io.File('\$roots')")

【讨论】:

你成功了!谢谢

以上是关于Kotlin 编译器抱怨在属性定义中使用 SPeL 表达式。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Kotlin 代码编译时报错 ( Variable ‘name‘ must be initialized | 初始化块定义在所有属性之后 )

SpEL表达式

如何在 Kotlin 中检查泛型类型

Android Kotlin:错误未解决参考:DaggerAppComponent

使用核心数据实现瞬态属性

在 Spring Cloud Dataflow 中引用属性