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 将在 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 工具窗口中,单击“刷新”按钮。
从菜单中选择Build > Rebuild Project
。
如果警告仍然出现,您可以尝试重新启动 IDE。选择File > 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
,您需要:
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 springboot无法读取配置文件的解决方法
Intellij Idea无法从Controller跳转到视图页面的解决方案