如何使用Spring Security代理修复val字段初始化?

时间:2017-09-26 04:09:06

标签: java spring spring-boot spring-security kotlin

考虑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。

以下是我在调试器中看到的内容:

enter image description here

但是当@Secured被移除时,一切正常。所以看起来Spring安全代理打破了kotlin val的初始化。有没有办法让它们一起工作?

1 个答案:

答案 0 :(得分:0)

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

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