Котлин с Spring Boot 2.0 @ConfigurationProperties не работает

Я создаю приложение, используя Spring Boot 2 с Kotlin.

Как-то я просто не могу заставить ConfigurationProperties работать.

Насколько мне известно, при запуске Maven compile в spring-configuration-metadata.json должен быть создан файл target/classes/META-INF.

Моя установка на данный момент:

pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.brabantia.log</groupId>
    <artifactId>logdb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>logdb</name>
    <description>Logging database Brabantia</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <kotlin.version>1.2.21</kotlin.version>
        <spring.boot.version>2.0.0.RELEASE</spring.boot.version>
    </properties>

    <dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
        <!-- START SPRING BOOT DEPENDENCIES -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>${spring.boot.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>${spring.boot.version}</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring.boot.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>${spring.boot.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- END SPRING BOOT DEPENDENCIES -->

        <!-- START FLYWAY DEPENDENCIES -->
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
        <!-- END FLYWAY DEPENDENCIES -->

        <!-- START KOTLIN DEPENDENCIES -->
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib-jdk8</artifactId>
            <version>1.2.30</version>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
            <version>1.2.30</version>
        </dependency>
        <!-- END KOTLIN DEPENDENCIES -->

        <!-- START DATABASE DEPENDENCIES -->
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- END DATABASE DEPENDENCIES -->

    </dependencies>

    <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>kotlin-maven-plugin</artifactId>
                <groupId>org.jetbrains.kotlin</groupId>
                <configuration>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>
                    <compilerPlugins>
                        <plugin>spring</plugin>
                    </compilerPlugins>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>5.0.7</version>
                <configuration>
                    <user>esb_logging_user</user>
                    <password>esb_logging_user</password>
                    <url>jdbc:sqlserver://localhost;database=esb_logging</url>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

LogDbProperties.kt

import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration

@Configuration
@ConfigurationProperties(prefix =  "logdb")
class LogDbProperties {
    var enabled: Boolean = false
}

LogDbApplication.kt

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class LogdbApplication: CommandLineRunner {
    override fun run(vararg args: String?) {
        println(logDbProperties.enabled)
    }

    @Autowired
    lateinit var logDbProperties: LogDbProperties
}

fun main(args: Array<String>) {
    runApplication<LogdbApplication>(*args)
}

Как я могу заставить это работать?

Обновлять

Кажется, что аннотации подобраны Spring, но IntelliJ просто не создает файл spring-configuration-metadata.json, что означает, что это просто автодополнения, которые не работают.

Итак, как я могу заставить IntelliJ создать файл spring-configuration-metadata.json?

Я столкнулся с той же проблемой, и, несмотря на то, что я следую предложению, изменений нет. IntelliJ 2018.1.3, Kotlin 1.2.41, SpringBoot 2.0.1

Rakesh N 18.05.2018 17:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
1
2 375
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пожалуйста, смотрите официальная документация Spring относительно генерации свойств конфигурации.

Вскоре вам нужно добавить это в maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Важно: идея IntelliJ не могла работать с kapt, который будет генерировать метаданные. Поэтому вам нужно попросить gradle / maven сделать полную сборку. Как результат:

  1. В ваших выходных папках будет сгенерирован spring-configuration-metadata.json.
  2. В вашей выходной банке тоже будет этот файл
  3. IntelliJ Idea прочитает этот файл и покажет основные моменты.

это не ответ. OP pom.xml действительно имеет эту зависимость, и создание метаданных не работает в этой настройке.

P.J.Meisch 19.05.2018 16:04
Ответ принят как подходящий

Благодаря этот пост на StackOverflow я наконец получил ответ

Просто чтобы решение было полным:

Добавьте следующую зависимость в pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency> 

И (это то, что отсутствуют во всех других ответах) добавьте это выполнение в kotlin-maven-plugin

<execution>
    <id>kapt</id>
    <goals>
        <goal>kapt</goal>
    </goals>
    <configuration>
        <sourceDirs>
            <sourceDir>src/main/kotlin</sourceDir>
        </sourceDirs>
        <annotationProcessorPaths>
            <annotationProcessorPath>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <version>1.5.3.RELEASE</version>
            </annotationProcessorPath>
        </annotationProcessorPaths>
    </configuration>
</execution>

Теперь пример класса ConfigurationProperties:

@ConfigurationProperties(prefix = "logdb")
class LogDbProperties {
    var enabled: Boolean = false
}

Теперь запустите mvn compile или mvn clean compile

И главное: у вас есть файл с именем spring-configuration-metadata.json в target/classes/META-INF.

В этом решении параметр enabled имеет значение по умолчанию false, если вы не хотите предоставлять значение по умолчанию, а также не хотите разрешать null (разумный запрос), вы можете сделать: @ConfigurationProperties(prefix = "logdb") class LogDbProperties { lateinit var enabled: Boolean = false }

Bwvolleyball 03.07.2018 23:36

Другие вопросы по теме