Как исправить инициализацию поля val с помощью прокси-сервера Spring Security?

Рассмотрим класс контроллера 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(); }