【问题标题】:Intellij IDEA complains cannot resolve spring boot properties but they work fineIntellij IDEA 抱怨无法解决 Spring Boot 属性,但它们工作正常
【发布时间】:2018-08-03 21:04:12
【问题描述】:

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

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

【问题讨论】:

  • 别担心;无论如何,IntelliJ 都会花一些时间来识别自定义属性。充其量你可以向 JetBrains 提交错误。
  • 您可以检查哪些方面与您的项目相关联。尝试 ctrl + alt + shift + s,并寻找方面。您可能必须手动添加一个弹簧(引导)方面以便 intellij 理解..
  • 我添加了spring facet,没有任何变化。但我的列表中没有 Spring(boot) 方面。可能是因为我使用的是 2016 版的 IDEA。
  • 能否提供样例项目示例供调查?
  • 尝试安装 Spring Assistant 插件。

标签: spring spring-boot intellij-idea application.properties


【解决方案1】:

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

选项 1:

如果您可以为您的属性使用@ConfigurationProperties-annotated 类,您可以将 Spring Boot 配置注释处理器添加到您的类路径中,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 工具窗口中,单击“刷新”按钮。

从菜单中选择Build &gt; Rebuild Project

如果警告仍然出现,您可以尝试重新启动 IDE。选择File &gt; Invalidate Caches / Restart,然后点击Invalidate and Restart

【讨论】:

  • 这正是我所需要的!我选择了选项 2!
  • 仅供参考。 Spring 参考 > 附录 B. 配置元数据:docs.spring.io/spring-boot/docs/current/reference/html/…
  • 从菜单中选择 Build > Rebuild Project 解决了我的问题
  • 我强烈建议使用选项 1(@ConfigurationProperties 和注释处理器),因为它可以省去元数据文件的繁琐且容易出错的手写操作。而且,在初始设置之后,它甚至比@Value 注解更容易使用。
  • @Namo 链接坏了,我想新的是Configuring the Annotation Processor
【解决方案2】:

请在 Gradle Kotlin Script for 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 Boot 配置处理器生成带有属性元数据的特殊 json 文件。

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

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

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

【讨论】:

  • 感谢您的出色回答。我注意到一些事情: 1. 我只需要添加依赖项,我不需要指定注释处理器类来生成文件。 2. 我不需要dependsOn(processResources),我什至不能导入processResources。 3. 如果我忽略annotationProcessor(configurationProcessor),我的 IntelliJ IDEA 不会抱怨。你能证实这些观察吗?
【解决方案3】:

我遇到了同样的问题,而且没有显示自动完成功能,发现它适用于 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 处理确切的属性名称以防止错误。
  • 确保您的配置类使用@ConfigurationProperties("name-here") 注释并且您已通过@EnableConfigurationProperties(NameOfTheConfigClass.class) 启用它

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      作为上述答案的附加要求。在 Spring-boot 2.2 之后,您可以在属性上使用 final 关键字和注释 @ConstructorBinding 以查看 IntelliJ 自动完成 application.properties 文件上的属性名称。如果您在属性上添加 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>
      

      【讨论】:

        猜你喜欢
        • 2019-10-29
        • 2018-06-13
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 2021-11-02
        • 2020-02-09
        • 2019-01-23
        相关资源
        最近更新 更多