考虑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
被移除时,一切正常。所以看起来Spring安全代理打破了kotlin val的初始化。有没有办法让它们一起工作?
答案 0 :(得分:0)
事实证明,默认情况下,kotlin将所有方法标记为final
。所以这些方法不能被覆盖,这就是为什么它是从对象本身调用的,而不是从代理调用的。因此,为了使代理工作只需在方法定义中添加open
关键字:
@PostMapping("/indexing")
@Secured("ROLE_USER")
/* -> */ open fun someFunction() {
return s3AsyncClient.toString();
}