Компилятор Kotlin жалуется на использование выражения SPeL в определении свойства. ЗАЧЕМ?

Когда я пытаюсь использовать выражение SPeL для инъекции значения, оно работает с Java, но НЕ в Котлине. Компилятор говорит

Ошибка: (13, 25) Kotlin: параметр аннотации должен быть константой времени компиляции

Код:

@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) } 

Mmm … news flash компилятор Kotlin: это постоянный! Компилятор явно знает, что это выражение SPeL, и ему это не нравится.

Мои вопросы:

  1. Почему Котлину не нравится SPeL? Это инъекция конструкции (или она) и не нарушает неизменности.

  2. Это ошибка компилятора? Сообщение неопровержимо неверно.

${roots} внутри String в Kotlin является строковым шаблоном , поэтому String не является константой.

Если вы хотите, чтобы строка содержала эти фактические символы и не интерпретировалась как шаблон, вам нужно будет избежать $ :

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