Kotlin では、とくに修飾子を付けない場合、クラスやメソッドは final
になります。これを Spring と組み合わせた場合、Proxy などを適用するにあたって相性が良くない。
そこで、open
という修飾子を使って final
になるのを回避するわけですが、せっかく Kotlin のおかげで簡潔になったはずのコードに、こういった一手間を加えてしまうというのは、好ましくないです。
こういった場合にどうしたら良いか、というのがこのポストです。
環境
- Oracle Java 1.8.0_121
- Maven 3.3.9 (Maven Wrapper)
- Kotlin 1.0.6
- Spring Boot 1.4.3.RELEASE
$ ./mvnw -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/yo1000/.m2/wrapper/dists/apache-maven-3.3.9-bin/2609u9g41na2l7ogackmif6fj2/apache-maven-3.3.9
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12", arch: "x86_64", family: "mac"
対応
build
plugin
に、spring
の設定を追加するだけです。
pom.xml (一部抜粋)
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<!-- .. -->
</plugin>
これで open
を付けずとも Kotlin で、問題なく Spring を扱えるようになります。
また、Spring Initializr で、使用言語に Kotlin を選択した場合も、依存関係に、これが自動で追加されるようになっているので、こちらも併せて利用してみるとよいかと思います。