Spring Proxy Class和Kotlin中的空指针异常

Spring Proxy Class和Kotlin中的空指针异常,第1张

概述我和kotlin一起面临春天的问题.我有一个控制器bean(没有接口btw),它通过主构造函数有一个自动连接的服务bean.除非我为控制器使用缓存注释,否则它工作正常.显然,spring缓存会在引擎盖下生成一个代理类来处理缓存.我的代码看起来像这样:@RestController @RequestMapping('/regions/') open class

我和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中的非空变量.

我假设class proxies generated by spring用null值而不是autowired bean初始化类.这必须是使用kotlin和spring的常见陷阱.你是怎么绕过这个问题的?最佳答案在Kotlin中默认为classes and members are final.

对于代理库(CGLIB,javaassist)能够代理方法,必须将其声明为非final和非final类(since those libraries implement proxying by subclassing).将您的控制器方法更改为:

@RequestMapPing("{ID}",method = arrayOf(RequestMethod.GET))@Cacheable(cachenames = arrayOf("regions"))open fun get(@PathVariable ID: Long): RegionResource {    return this.service.get(ID)}

您可能会在控制台中看到有关RegionController方法不受代理约束的警告.

The Kotlin compiler plugin

Kotlin团队承认了这一困难并创建了一个插件,标志着标准的AOP代理候选者,例如: @Component打开.

您可以在build.gradle中启用插件:

plugins {  ID "org.jetbrains.kotlin.plugin.spring" version "1.1.60"}
总结

以上是内存溢出为你收集整理的Spring Proxy Class和Kotlin中的空指针异常全部内容,希望文章能够帮你解决Spring Proxy Class和Kotlin中的空指针异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1269338.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存