Intellij IDEA 抱怨无法解决 Spring Boot 属性,但它们工作正常

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于Intellij IDEA 抱怨无法解决 Spring Boot 属性,但它们工作正常的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA无法新建类解决办法

IntelliJ IDEA无法新建类解决办法

intellij idea springboot无法读取配置文件的解决方法

Intellij Idea无法从Controller跳转到视图页面的解决方案

Intellij idea 无法解决 maven 中的任何问题

Intellij Idea无法从Controller跳转到视图页面的解决方案