如何修复与Spring安全代理的val字段初始化?

考虑kotlin控制器类:

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

这导致NullPointerException。

这是我在调试器中看到的:

在这里输入图像描述

但是,当@Secured被删除一切正常。 所以春天的安全代理似乎破坏了kotlin val的初始化。 有没有办法让他们一起工作?

事实证明,默认情况下,kotlin将所有方法标记为final 。 所以这些方法不能被覆盖,这就是为什么它是从对象本身调用的,而不是来自代理的。 所以要使代理工作只是在方法定义中添加open关键字:

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