2017-09-26 81 views
0

考虑科特林控制器类:如何使用Spring Security代理修正val字段初始化?

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

导致空指针异常。

以下是我在锯调试:

enter image description here

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

+0

你能尝试'@PreAuthorize的''而不是@Secured( “ROLE_USER”)'( “hasRole( 'ROLE_USER')”)。 –

+1

它的工作原理!但有什么区别? – Cherry

+0

我回答了那个。如果它有效,那么你可以接受和赞成答案。 –

回答

0

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

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