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 将在 target
或 out
:
中为您生成配置元数据
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生成这个文件
- 使用
dependsOn
在jar
打包之前更新任务序列以生成文件(不确定,我上面的代码是最有效的解决方案,但是问题已解决)
但是 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>
Can not resolve configuration property '...
我可以通过@Value 注释或通过自动装配的环境访问我的属性。但是我自己定义的所有属性在 IDEA 中都会收到此警告。我应该怎么做才能让 IDEA 识别这些并且不打扰我?
为了让 IntelliJ IDEA 知道您的 Spring 启动属性,您可以在项目中定义 Spring 启动配置元数据 .
选项 1:
如果您可以为您的属性使用 @ConfigurationProperties
-注释 class,您可以将 Spring 引导配置注释处理器添加到您的 class 路径和 IntelliJ IDEA 将在 target
或 out
:
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生成这个文件
- 使用
dependsOn
在jar
打包之前更新任务序列以生成文件(不确定,我上面的代码是最有效的解决方案,但是问题已解决)
但是 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>