簡體   English   中英

Spring Proxy Class和Kotlin中的空指針異常

[英]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.servicenull ,這在技術上是不可能的,因為它是kotlin中的非null變量。

我假設spring生成的類代理用null值而不是autowired bean初始化類。 這必須是使用kotlin和spring的常見陷阱。 你是怎么繞過這個問題的?

在Kotlin ,默認情況下, 班級和成員都是最終的。

對於能夠代理方法的代理庫( CGLIBjavaassist ),它必須被聲明為非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編譯器插件

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM