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

nkkqxpd9  于 2023-04-19  发布在  Spring
关注(0)|答案(6)|浏览(282)

无法解析配置属性'…
我通过@Value注解或通过自动连接的环境访问我的属性没有问题。但是我自己定义的所有属性在IDEA中都得到了这个警告。我应该做些什么才能让IDEA识别这些属性而不打扰我呢?

roejwanj

roejwanj1#

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

选项一:

如果你可以为你的属性使用一个@ConfigurationProperties注解的类,你可以将Sping Boot 配置注解处理器添加到你的classpath中,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'

选项二:

自行创建配置元数据文件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

waxmsbnn

waxmsbnn2#

请为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)
    }
}

需要KotlinKapt来处理元数据和内存。
official Spring documentation,Sping Boot Configuration Processor生成带有属性元数据的特殊json文件。
因此,要分发jar与属性语法突出显示,您需要:

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

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

hgc7kmma

hgc7kmma3#

我也有同样的问题,加上没有显示自动完成,发现它适用于IntelliJ旗舰版,而不是社区版本。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复制属性的确切名称以防止错误。
  • 确保你的config类用@ConfigurationProperties("name-here")注解,并且你已经用@EnableConfigurationProperties(NameOfTheConfigClass.class)启用了它
1aaf6o9v

1aaf6o9v4#

基于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任务)后,有关属性的警告应该消失。
不理想,但IntelliJ不支持kapt也不理想:-/

ffx8fchx

ffx8fchx5#

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

@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>
f4t66c6m

f4t66c6m6#

Spring Voot 3+在application.propertiesu可以使用

spring.ldap.urls=192.168.1.1 #instead of spring.ldap.url
spring.ldap.base=dc=example,dc=com
spring.ldap.username=uid=admin,ou=system
spring.ldap.password=secret

相关问题