¿Cómo se soluciona la initialization del campo val con el proxy Spring Security?

Considere la class de controller kotlin:

@RestController @RequestMapping("/myPath/") open class MyController { private val s3AsyncClient: S3AsyncClient = S3AsyncClient.builder().build() //... @PostMapping("/indexing") @Secunetworking("ROLE_USER") fun someFunction() { return s3AsyncClient.toString(); } } 

Lo que lleva a NullPointerException.

Aquí está lo que vi en el depurador:

enter image description here

Pero cuando se quita @Secunetworking todo funciona. Entonces parece que la proxing de security de spring rompe la initialization de kotlin val. ¿Hay alguna manera de hacer que funcionen todos juntos?

Resulta que por defecto kotlin marca todos los methods como final . Por lo tanto, los methods no se pueden anular y es por eso que se llama desde el object en sí, no desde los proxies. Para que el proxy funcione, solo agregue open palabra key open en la definición del método:

 @PostMapping("/indexing") @Secunetworking("ROLE_USER") /* -> */ open fun someFunction() { return s3AsyncClient.toString(); }