[英]Null Pointer Exception In Spring Proxy Class and Kotlin
我和kotlin一起面臨春天的問題。
我有一個控制器bean(沒有接口btw),它通過主構造函數有一個自動連接的服務bean。
除非我為控制器使用緩存注釋,否則它工作正常。 顯然,spring緩存會在引擎蓋下生成一個代理類來處理緩存。
我的代碼看起來像這樣:
@RestController
@RequestMapping("/regions/")
open class RegionController @Autowired constructor(val service: RegionService) {
@RequestMapping("{id}", method = arrayOf(RequestMethod.GET))
@Cacheable(cacheNames = arrayOf("regions"))
fun get(@PathVariable id: Long): RegionResource {
return this.service.get(id)
}
}
現在問題是在執行方法時出現空指針異常,實際上this.service
為null
,這在技術上是不可能的,因為它是kotlin中的非null
變量。
我假設spring生成的類代理用null值而不是autowired bean初始化類。 這必須是使用kotlin和spring的常見陷阱。 你是怎么繞過這個問題的?
對於能夠代理方法的代理庫( CGLIB , javaassist ),它必須被聲明為非final和非final類( 因為這些庫通過子類實現代理 )。 將您的控制器方法更改為:
@RequestMapping("{id}", method = arrayOf(RequestMethod.GET))
@Cacheable(cacheNames = arrayOf("regions"))
open fun get(@PathVariable id: Long): RegionResource {
return this.service.get(id)
}
您可能會在控制台中看到有關RegionController
方法不受代理約束的警告。
Kotlin團隊承認了這一困難並創建了一個插件,標志着標准的AOP代理候選者,例如@Component
with open
。
您可以在build.gradle
啟用插件:
plugins {
id "org.jetbrains.kotlin.plugin.spring" version "1.1.60"
}
很快,這可能不再是一個問題。
正在進行的工作中,任何lib(包括spring)都可以在META-INF中指定文件的注釋列表。 一旦用其中一個類注釋了類,它將默認為類本身及其所有函數打開。 對於從帶注釋的類繼承的類也是如此。
有關更多詳細信息,請查看https://github.com/Kotlin/KEEP/pull/40#issuecomment-250773204
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.