1. Обзор
В Kotlin все классы по умолчанию являются окончательными, что, помимо очевидных преимуществ, может создавать проблемы в приложениях Spring. Проще говоря, некоторые области в Spring работают только с классами, не являющимися окончательными.
Естественным решением является ручное открытие классов Kotlin с помощью ключевого слова open или использование плагина kotlin-allopen, который автоматически открывает все классы, необходимые для работы Spring.
2. Зависимости Maven
Давайте начнем с добавления зависимости Kotlin-Allopen:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>1.1.4-3</version>
</dependency>
Чтобы включить плагин, нам нужно настроить kotlin-все открыто в разделе сборки:
<build>
...
<plugins>
...
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>1.1.4-3</version>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<jvmTarget>1.8</jvmTarget>
</configuration>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>1.1.4-3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
3. Настройка
Теперь давайте рассмотрим SimpleConfiguration.kt, простой конфигурационный класс:
@Configuration
class SimpleConfiguration {
}
4. Без Kotlin-Allopen
Если мы создадим наш проект без плагина, мы увидим следующее сообщение об ошибке:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: @Configuration class 'SimpleConfiguration' may not be final.
Remove the final modifier to continue.
Единственный способ решить эту проблему - открыть ее вручную:
@Configuration
open class SimpleConfiguration {
}
5. Включая Kotlin-Allopen
Открывать все классы для Spring не очень удобно. Если мы будем использовать плагин, все необходимые классы будут открыты.
Мы можем ясно увидеть это, если посмотрим на скомпилированный класс:
@Configuration
public open class SimpleConfiguration public constructor() {
}
6. Заключение
В этой краткой статье мы рассмотрели, как решить проблему “класс может быть не окончательным” в Spring и Kotlin.
Оригинал статьи: https://www.baeldung.com/kotlin/allopen-spring