Найти тему

Kotlin - allopen и Spring

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