新的语言就是新的坑,大家哼次哼次往里跳,跳完了再努力爬,就看谁爬得快。
作为一名Java老码农今年开始接触kotlin后也是跳坑不可自拔,一路也是爬了跳出,跳了爬出,好不容易到了当前的阶段。
因为我是用kotlin写spring ,应该没人那么蠢吧(写Android 的多一些吧,我猜)
好,现在回归正题,今天遇到的问题就是:
kotlin的allOpen 在module中失效
众所皆知 kotlin 默认是final的真的很疯狂,然后spring,hibernate这种最爱cglib动态代理的框架,遇到final就傻眼,
spring 异常说 类是final,你这样我没办法动态增强啊,或者你的方法是final的我没办法啊(摊手)
用了gradle的kotlin spring插件后,主模块轻松的度过了问题;但module里面的代码编译出来还是final的。
看了module的配置,发现一个特殊之处,就是主模块(main/test)都有一个plugin的tab

自己加的模块就没有,(经过漫长的尝试)最后终于找到答案,直接改模块的iml ,贴入下述信息:
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
<compilerSettings />
<compilerArguments>
<option name="noStdlib" value="true" />
<option name="noReflect" value="true" />
<option name="moduleName" value="backend" />
<option name="jvmTarget" value="1.8" />
<option name="addCompilerBuiltIns" value="true" />
<option name="loadBuiltInsFromDependencies" value="true" />
<option name="languageVersion" value="1.2" />
<option name="apiVersion" value="1.2" />
<option name="pluginOptions">
<array>
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.boot.test.context.SpringBootTest" />
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.cache.annotation.Cacheable" />
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.scheduling.annotation.Async" />
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.stereotype.Component" />
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.transaction.annotation.Transactional" />
<option value="plugin:org.jetbrains.kotlin.allopen:annotation=org.springframework.validation.annotation.Validated" />
<option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Embeddable" />
<option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.Entity" />
<option value="plugin:org.jetbrains.kotlin.noarg:annotation=javax.persistence.MappedSuperclass" />
<option value="plugin:org.jetbrains.kotlin.noarg:invokeInitializers=false" />
</array>
</option>
<option name="pluginClasspaths">
<array>
<option value="$KOTLIN_BUNDLED$/lib/allopen-compiler-plugin.jar" />
<option value="$KOTLIN_BUNDLED$/lib/noarg-compiler-plugin.jar" />
</array>
</option>
</compilerArguments>
</configuration>
基本上就是强行配属性,然后ide上果然出现了plugins面板。
编译一下,问题解决
Kotlin与Spring集成之allOpen
本文解决了Kotlin在Spring框架中使用时遇到的final修饰符问题,通过配置Gradle插件使模块代码能够正确地被动态代理,实现spring、hibernate等框架的功能。
48万+

被折叠的 条评论
为什么被折叠?



