Intellij IDEA 抱怨无法解析 spring 引导属性,但它们工作正常

Intellij IDEA complains cannot resolve spring boot properties but they work fine

Can not resolve configuration property '...

我可以通过@Value 注释或通过自动装配的环境访问我的属性。但是我自己定义的所有属性在 IDEA 中都会收到此警告。我应该怎么做才能让 IDEA 识别这些并且不打扰我?

为了让 IntelliJ IDEA 知道您的 Spring 启动属性,您可以在项目中定义 Spring 启动配置元数据 .

选项 1:

如果您可以为您的属性使用 @ConfigurationProperties-注释 class,您可以将 Spring 引导配置注释处理器添加到您的 class 路径和 IntelliJ IDEA 将在 targetout:

中为您生成配置元数据

Maven:

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

Gradle:

implementation 'org.springframework.boot:spring-boot-configuration-processor'

选项 2:

自己创建配置元数据文件src/main/resources/META-INF/spring-configuration-metadata.json:

内容:

{
  "properties": [
    {
      "name": "myapp.someprop",
      "type": "java.lang.String"
    },
    {
      "name": "myapp.someintprop",
      "type": "java.lang.Integer"
    }
  ]
}

选项 1 和 2:

在构建系统 (Maven/Gradle) 的 IntelliJ IDEA 工具 window 中,单击 "Refresh" 按钮。

Select Build > Rebuild Project 来自菜单。

如果仍然出现警告,您可以尝试重新启动IDE。 Select File > Invalidate Caches / Restart 然后点击 Invalidate and Restart.

请为 Gradle Kotlin 项目的 Kotlin 脚本使用以下内容:

plugins {
    kotlin("jvm")
    kotlin("kapt")
}

/* ... */

dependencies {
    val configurationProcessor ="org.springframework.boot:spring-boot-configuration-processor:${BuildConstants.springBootVersion}"

    kapt(configurationProcessor) // for jar
    kaptTest(configurationProcessor) // for jar
    annotationProcessor(configurationProcessor) // for IntelliJ Idea
}

/* ... */

kapt {
    annotationProcessor("org.springframework.boot.configurationprocessor.ConfigurationMetadataAnnotationProcessor")
}

/* ... */

tasks {
    withType<KotlinCompile> {
        dependsOn(processResources)
    }
}

需要 Kotlin Kapt 才能处理元数据和内存。

official Spring documentation、Spring 启动配置处理器生成带有属性元数据的特殊 json 文件。

因此,要使用 属性 语法高亮分发 jar,您需要:

  • 要求Gradle生成这个文件
  • 使用dependsOnjar打包之前更新任务序列以生成文件(不确定,我上面的代码是最有效的解决方案,但是问题已解决)

但是 IntelliJ Idea 使用 annotationProcessor Gradle 配置(不幸的是,我没有确切的答案,为什么它需要确切的答案)。因此,您还需要将相同的处理器添加到 annotationProcessor 配置中。

我有同样的问题而且没有显示自动完成发现它适用于 IntelliJ Ultimate 版本而不是社区版本。 link

要采取的几个有用步骤是:

  • 添加 Maven 依赖项:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • 刷新 Maven 以下载依赖项。
  • target/classes/META-INF/spring-configuration-metadata.js 复制 属性 的确切名称以防止错误。
  • 确保您的配置 class 带有 @ConfigurationProperties("name-here") 注释并且您已通过 @EnableConfigurationProperties(NameOfTheConfigClass.class)
  • 启用它

Gradle-based 解决方法是这样的:

afterEvaluate {
    val kaptKotlinTasks = tasks.named("kaptKotlin") {
        doLast {
            val kaptKotlin = this
            tasks.named<ProcessResources>("processResources") {
                from(kaptKotlin.outputs) {
                    include("META-INF/spring-configuration-metadata.json")
                }
            }
        }
    }
    tasks.named("processResources") {
        this.dependsOn(kaptKotlinTasks)
    }
}

从 Intellij Gradle 面板 运行 构建(或只是 processResources 任务)后,关于属性的警告应该消失。

不理想,但不支持 kapt 的 IntelliJ 也不理想:-/

作为上述答案的附加要求。在 Spring-boot 2.2 之后,您可以在属性上使用 final 关键字和注释 @ConstructorBinding 以便看到 IntelliJ 自动完成 [=14] 上的 属性 名称=] 文件。如果您在属性上添加 java 文档,IntelliJ 也会识别。

@ConfigurationProperties(prefix = "my-config")
@ConstructorBinding
public class ConfigImportService {

    /**
     * the name of the bucket 
     * (IntelliJ shows this comment on the application.properties file)
     */
    private final String bucketName;
    private final String databaseName;

    @Autowired
    public ConfigImportService(
        @Value("${bucket.name}") String bucketName,
        @Value("${db.name}") String databaseName
    ) {
        this.bucketName = bucketName;
        this.databaseName = databaseName;
    }
}

当然,仍然需要依赖。

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