无法解析配置属性'...
通过 @Value 注释或自动装配的 Evironment 访问我的属性没有问题。但是我自己定义的所有属性在 IDEA 中都会收到此警告。我应该怎么做才能让 IDEA 识别这些而不打扰我?
无法解析配置属性'...
通过 @Value 注释或自动装配的 Evironment 访问我的属性没有问题。但是我自己定义的所有属性在 IDEA 中都会收到此警告。我应该怎么做才能让 IDEA 识别这些而不打扰我?
为了让 IntelliJ IDEA 了解您的 Spring Boot 属性,您可以在项目中定义Spring Boot 配置元数据。
如果您可以为您的属性使用@ConfigurationProperties
-annotated 类,您可以将 Spring Boot 配置注释处理器添加到您的类路径中,IntelliJ IDEA 将在target
or中为您生成配置元数据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'
自己创建配置元数据文件src/main/resources/META-INF/spring-configuration-metadata.json
:
内容:
{
"properties": [
{
"name": "myapp.someprop",
"type": "java.lang.String"
},
{
"name": "myapp.someintprop",
"type": "java.lang.Integer"
}
]
}
在构建系统 (Maven/Gradle) 的 IntelliJ IDEA 工具窗口中,单击“刷新”按钮。
Build > Rebuild Project
从菜单中选择。
如果警告仍然出现,您可以尝试重新启动 IDE。选择File > Invalidate Caches / Restart
并单击Invalidate and Restart
。
请为 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
使用属性语法高亮分发,您需要:
jar
使用打包前更新任务序列以生成文件dependsOn
(不确定,我上面的代码是最有效的解决方案,但是问题解决了)但是 IntelliJ Idea 适用于annotationProcessor
Gradle 配置(不幸的是,我没有确切的答案,为什么它需要确切的答案)。因此,您还需要将相同的处理器添加到annotationProcessor
配置中。
我有同样的问题加上没有显示自动完成发现它适用于 IntelliJ Ultimate 版而不是社区版。关联
几个有用的步骤是:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
target/classes/META-INF/spring-configuration-metadata.js
以防止错误。@ConfigurationProperties("name-here")
并且您已通过以下方式启用它@EnableConfigurationProperties(NameOfTheConfigClass.class)
基于 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 也不理想:-/
作为上述答案的附加要求。在 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>