101

在此处输入图像描述

无法解析配置属性'...

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

4

5 回答 5

112

为了让 IntelliJ IDEA 了解您的 Spring Boot 属性,您可以在项目中定义Spring Boot 配置元数据

选项1:

如果您可以为您的属性使用@ConfigurationProperties-annotated 类,您可以将 Spring Boot 配置注释处理器添加到您的类路径中,IntelliJ IDEA 将在targetor中为您生成配置元数据out

马文:

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

摇篮:

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 工具窗口中,单击“刷新”按钮。

Build > Rebuild Project从菜单中选择。

如果警告仍然出现,您可以尝试重新启动 IDE。选择File > Invalidate Caches / Restart并单击Invalidate and Restart

于 2018-06-09T16:36:56.630 回答
2

请为 Kotlin 项目的 Gradle 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 来处理元数据和内存。

官方 Spring 文档中,Spring Boot 配置处理器生成带有属性元数据的特殊 json 文件。

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

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

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

于 2019-12-24T11:14:52.467 回答
1

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

几个有用的步骤是:

  • 添加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以防止错误。
  • 确保您的配置类带有注释@ConfigurationProperties("name-here")并且您已通过以下方式启用它@EnableConfigurationProperties(NameOfTheConfigClass.class)
于 2020-06-23T12:02:25.343 回答
0

基于 Gradle 的解决方法是:

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 也不理想:-/

于 2020-10-16T20:31:15.547 回答
0

作为上述答案的附加要求。在 Spring-boot 2.2 之后,您可以final在属性上使用关键字和注释@ConstructorBinding,以查看 IntelliJ 自动完成application.properties文件上的属性名称。IntelliJ 还可以识别您是否在属性上添加了 java 文档。

@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>
于 2021-11-24T14:03:43.347 回答