El comstackdor de Kotlin se queja de usar una expresión SPeL en una definición de propiedad. ¿POR QUÉ?

Cuando trato de usar una expresión SPeL para inyectar un valor, funciona en Java pero NO en Kotlin. El comstackdor dice

Error: (13, 25) Kotlin: un parámetro de anotación debe ser una constante en time de compilation

Código:

@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 … noticias flash comstackdor de Kotlin: ¡ES una constante! El comstackdor sabe claramente que es una expresión SPeL y no le gusta.

Mis preguntas:

  1. ¿Por qué Kotlin no le gusta SPeL? Esta es una inyección de construcción (o lo es) y no viola la inmutabilidad.

  2. ¿Es esto un error del comstackdor? El post es irrefutablemente incorrecto.

${roots} dentro de una cadena en Kotlin es una plantilla de cadena , por lo tanto, esa cadena no es una constante.

Si desea que String contenga esos caracteres reales y no se interprete como una plantilla, tendrá que escaping de $ :

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