【问题标题】:spring-configuration-metadata.json file is not generated in IntelliJ Idea for Kotlin @ConfigurationProperties class在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件
【发布时间】:2016-10-17 22:47:36
【问题描述】:

我正在尝试为基于 Spring Boot 的项目生成 spring-configuration-metadata.json 文件。如果我使用 Java @ConfigurationProperties 类,它会正确自动生成:

@ConfigurationProperties("myprops")
public class MyProps {

    private String hello;

    public String getHello() {
        return hello;
    }

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

但如果我使用 Kotlin 类,则不会生成 spring-configuration-metadata.json 文件(我已经尝试过 gradle build 和 Idea Rebuild Project )。

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

AFAIK Kotlin 使用构造函数、getter 和 setter 生成相同的类,并且应该充当常规 Java bean。

知道为什么 spring-boot-configuration-processor 不适用于 Kotlin 类吗?

【问题讨论】:

  • 我似乎在使用 groovy 时遇到了同样的问题
  • 尽管尝试了所有建议,但我遇到了同样的问题。我的环境——IntelliJ 2018.1.3 CE、SpringBoot 2.0.1、Kotlin 1.2.41

标签: spring intellij-idea gradle spring-boot kotlin


【解决方案1】:

感谢您为我指明了正确的方向。所以解决方法是添加

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

build.gradle文件,在命令行运行gradle compileJava并在IntelliJ Idea设置中开启注解处理Build, Execution, Deployment -> Compiler - > 注释处理器 -> 启用注释处理。其余配置保持the same

还要注意没有这一行

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

IntelliJ Idea 会抱怨

无法解析配置属性

application.propertiesapplication.yml

中的消息

【讨论】:

  • 您能否针对 groovy 的相同问题提出解决方案?
  • 正如 Stéphane Nicoll 所说,目前 Spring Boot 只支持 Java。在基于 Kotlin 的项目的工作中,我得出的结论是,最好将 Java 类用于自定义属性。其他一切都是编译器、编程语言和 IDE 的技巧和解决方法(目前)。
  • 我使用 spring boot 1.4.0 在 kotlin 中运行良好。不使用 propdeps 或 java 端的任何东西。在我的 web 模块中,使用了所有配置,我添加了 kapt "org.springframework.boot:spring-boot-configuration-processor" 就是这样
  • compileOnly Gradle 4 中的范围
【解决方案2】:

对于那些想要使用 Maven 而不是 Gradle 的人,您需要在 kotlin-maven-plugin 配置中添加一个 kapt 执行。

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

如果将诸如 kotlin-maven-allopen 之类的编译器插件声明为依赖项,则存在一个未解决的问题 KT-18022 会阻止此操作。

【讨论】:

  • 上述问题已解决,我可以确认 Maven 解决方案在与 Kotlin 1.1.4 和 Spring Boot 1.5.6 一起使用时开箱即用。
【解决方案3】:

Kotlin 有自己的编译器。元数据由annotation processor 生成,它是 Java 编译器中的一个挂钩点。

我不知道 Kotlin 中是否有这样的挂钩点,但无论如何,Spring Boot 目前不支持 Java 以外的任何东西。也许this would help?

【讨论】:

猜你喜欢
  • 2020-01-16
  • 2022-01-23
  • 2021-03-24
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2013-01-21
相关资源
最近更新 更多