在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件

Posted

技术标签:

【中文标题】在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件【英文标题】:spring-configuration-metadata.json file is not generated in IntelliJ Idea for Kotlin @ConfigurationProperties class 【发布时间】: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 【参考方案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?

【讨论】:

这可能也有帮助:kotlinlang.org/docs/reference/…

以上是关于在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA怎么使用系统默认配置的JDK

IntelliJ IDEA怎么使用系统默认配置的JDK

IntelliJ IDEA 中的 java Maven 项目,如何找到不需要的依赖项?

未为 Google OAUTH 登录配置访问权限

IntelliJ 2020.1 版中未安装 Flutter 插件

intellij idea 14.1.5 怎样设置中文