2016-06-16 7 views
6

Ich versuche, die Datei spring-configuration-metadata.json für mein Spring Boot-basiertes Projekt zu erstellen. Wenn ich Java @ConfigurationProperties Klasse verwenden, ist es richtig und automatisch generiert:Die Datei spring-configuration-metadata.json wird nicht in IntelliJ Idea für die Klasse Kotlin @ConfigurationProperties generiert

@ConfigurationProperties("myprops") 
public class MyProps { 

    private String hello; 

    public String getHello() { 
     return hello; 
    } 

    public void setHello(String hello) { 
     this.hello = hello; 
    } 
} 

Aber wenn ich Kotlin Klasse die federkonfigurations metadata.json Datei nicht erzeugt wird (ich habe beide versucht verwenden Gradle Build und Idee Projekt neu erstellen).

@ConfigurationProperties("myprops") 
class MyProps { 
    var hello: String? = null 
} 

AFAIK Kotlin erzeugt die gleiche Klasse mit Konstruktor, Getter und Setter und soll als regulären Java Bean handeln.

Irgendwelche Ideen warum Spring-Boot-Konfiguration-Prozessor funktioniert nicht mit Kotlin-Klassen?

+0

Ich habe anscheinend das gleiche Problem mit groovy –

Antwort

6

Vielen Dank für mich in die richtige Richtung. So ist die Lösung

dependencies { 
    ... 
    kapt "org.springframework.boot:spring-boot-configuration-processor" 
    optional "org.springframework.boot:spring-boot-configuration-processor" 
    ... 
} 

zu build.gradle Datei hinzufügen, führen gradle compileJava in der Befehlszeile und schalten Sie Anmerkung Verarbeitung in IntelliJ Idea Einstellungen Bauen, Ausführung, Deployment -> Compiler -> Annotation Prozessor -> Anotationsverarbeitung aktivieren. Der Rest der Konfiguration bleibt the same

Beachten Sie auch, dass ohne diese Linie

optional "org.springframework.boot:spring-boot-configuration-processor" 

IntelliJ Idea whith

beschweren kann nicht Konfigurationseigenschaft

Nachricht in Ihrem Anwendung lösen. Eigenschaften oder application.yml

+0

Können Sie eine Lösung für das gleiche Problem vorschlagen mit groovy? –

+0

Wie Stéphane Nicoll sagte, unterstützt Spring Boot derzeit nur Java. Während der Arbeit am Kotlin-basierten Projekt kam ich zu dem Schluss, dass es besser ist, Java-Klassen für benutzerdefinierte Eigenschaften zu verwenden. Alles andere ist Hacks und Workarounds (im Moment) für Compiler, Programmiersprache und IDE. –

+0

Ich habe das funktioniert gut in Kotlin, mit Spring Boot 1.4.0. Ohne propdeps oder irgendetwas auf der Java-Seite zu verwenden. In meinem Web-Modul, wo die ganze Konfiguration verwendet wird, fügte ich Kapt "org.springframework.boot: Spring-Boot-Konfiguration-Prozessor" und das war es – MrBigglesworth

1

Kotlin hat seinen eigenen Compiler. Die Metadaten werden von einem annotation processor generiert, der ein Hook-Point im Java-Compiler ist.

Ich habe keine Ahnung, ob ein solcher Hook-Point in Kotlin verfügbar ist, aber in jedem Fall unterstützt Spring Boot momentan nichts anderes als Java. Vielleicht this would help?

+1

Dies könnte auch helfen: https://kotlinlang.org/docs/reference/using-gradle.html#annotation-processing –

1

Für diejenigen, die Maven statt Gradle verwenden möchten, müssen Sie eine kapt Ausführung zur Kotlin-Maven-Plugin-Konfiguration hinzufügen.

<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> 

Es ist eine offene Frage KT-18022, die diese Funktionalität verhindert, wenn eine Compiler-Plugin wie kotlin-maven-allopen als Abhängigkeit deklariert wird.

+0

Das erwähnte Problem ist behoben und ich kann bestätigen, dass die Maven-Lösung funktioniert der Box bei Verwendung mit Kotlin 1.1.4 und Spring Boot 1.5.6. –