@ConfigurationProperties Spring Boot 配置注释处理器在类路径中找不到
Posted
技术标签:
【中文标题】@ConfigurationProperties Spring Boot 配置注释处理器在类路径中找不到【英文标题】:@ConfigurationProperties Spring Boot Configuration Annotation Processor not found in classpath 【发布时间】:2017-08-07 22:12:30 【问题描述】:我尝试在 Spring Boot 中完成自定义属性。
我尝试通过 IntelliJ IDEA 2016.3 创建一个简单的项目:
-
使用 Spring Boot Initializer 创建了一个新的 Gradle 项目(我根本没有检查任何东西)。
创建了一个新类
Properties
。
当我用@ConfigurationProperties
注释它时,出现了下一个通知:
The documentation 说我应该在我的项目中添加以下内容:
dependencies
optional "org.springframework.boot:spring-boot-configuration-processor"
compileJava.dependsOn(processResources)
之后,我尝试重建项目并在设置中启用注释处理器,但通知没有消失。完成也不起作用(我创建了一个字符串my
)。
【问题讨论】:
你使用什么 Gradle 版本? this answer 有帮助吗? 现在可以了,但是我忘记添加propdeps-plugin
,所以我不确定新版本的IDE是否是解决方案。无论如何,我赞成你的回答。
【参考方案1】:
我忘记添加propdeps-plugin。但是,我记得即使使用 2016.3 上的插件它也对我不起作用,所以正如 @CrazyCoder 提到的,尝试降级 Gradle 或下载新的 2017.1 版本 (details)。
当您解决此问题时,您也可能会收到Re-run Spring Boot Configuration Annotation Processor to update generated metadata
。为此,请单击 Refresh all Gradle projects
(在 Gradle 侧面菜单中)。
【讨论】:
仍然不适合我。我添加了propdeps-plugin
、optional
行和compileJava.dependsOn(processResources)
,得到了 IntelliJ IDEA 2017.3。尝试在 Gradle 中运行clean
任务,然后是Refresh all
和Build
,仍然没有。有什么想法吗?【参考方案2】:
我遇到了同样的问题。我使用idea 2017.2和gradle 4.1, 一些博客说你应该添加:
dependencies
optional "org.springframework.boot:spring-boot-configuration-processor"
但我改成这样了:
dependencies
compile "org.springframework.boot:spring-boot-configuration-processor"
警告消失了。
【讨论】:
这个问题困扰我好几个月了。我尝试了其余的答案,但没有任何效果。这以某种方式起作用。在 Gradle 5.2.1 和 IDEA 2018.3.5 上运行 @k9yosh 对于 Gradle 5.2.1 更喜欢 another answer【参考方案3】:以下作品适合我:
buildscript
repositories
jcenter()
maven url 'https://repo.jenkins-ci.org/public/'
maven url 'http://repo.spring.io/plugins-release'
dependencies
classpath "io.spring.gradle:propdeps-plugin:0.0.9.RELEASE"
...
apply plugin: 'propdeps'
apply plugin: 'propdeps-eclipse'
apply plugin: 'propdeps-idea'
...
dependencyManagement
imports
mavenBom 'org.springframework.boot:spring-boot-starter-parent:2.0.0.RELEASE'
...
dependencies
compile "org.springframework.boot:spring-boot-starter"
compile "org.springframework.boot:spring-boot-starter-actuator"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor" // for @ConfigurationProperties, make sure compileJava.dependsOn(processResources)
...
compileJava.dependsOn(processResources)
【讨论】:
【参考方案4】:我在 IntelliJ 版本 2018.1.2 上遇到了同样的问题。我还必须定义 spring-boot-configuration-processor 的实际版本才能使其正常工作:
compile('org.springframework.boot:spring-boot-configuration-processor:2.0.1.RELEASE')
【讨论】:
对我来说是compileOnly "org.springframework.boot:spring-boot-configuration-processor:$springVersion"
【参考方案5】:
根据Spring Boot docs,自Gradle 4.6以来正确的配置是
dependencies
annotationProcessor group: 'org.springframework.boot', name: 'spring-boot-configuration-processor'
// ...
IntelliJ IDEA 自构建 193.3382 (2019.3) 起支持 annotationProcessor
范围。不要忘记在 IntelliJ IDEA 设置中启用 annotation processing。
【讨论】:
【参考方案6】:在 IntelliJ 的 2018.3 版本中,我通过以下方式解决了这个问题(根据 this documentation):
对于 Gradle 4.5 及更早版本,依赖项应在 compileOnly 配置,如下例所示:
dependencies compileOnly "org.springframework.boot:spring-boot-configuration-processor"
对于 Gradle 4.6 及更高版本,依赖项应在 annotationProcessor 配置,如下例所示:
dependencies annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
【讨论】:
【参考方案7】:在 IDEA 中发生这种情况有两个原因:
-
仔细检查您的设置是否在 IDEA 中被选中(启用):首选项->注释处理器->启用注释处理。
更新您的想法后,检查您的插件并更新它们。碰巧插件与您的新 IDEA 版本不兼容,因此只需单击更新它们。
【讨论】:
在我的想法中,(1) 是:文件 |设置 |构建、执行、部署 |编译器 |注释处理器【参考方案8】:在 maven 项目中帮助添加依赖 spring-boot-configuration-processor 并使用 @EnableConfigurationProperties(AppProperties.class) 标记主类。
也许有人帮忙。
【讨论】:
【参考方案9】:对于 Kotlin 项目,自 Gradle 4.6 以来的工作配置使用注释处理器
apply plugin: "kotlin-kapt"
dependencies
kapt("org.springframework.boot:spring-boot-configuration-processor:$springBootVersion")
compileOnly("org.springframework.boot:spring-boot-configuration-processor:$springBootVersion")
【讨论】:
感谢您的评论,我也设法生成了元文件,但不幸的是 IntelliJ 没有选择它。我找到了related issue in jetbrains bugtracker。你设法让它工作了吗?【参考方案10】:根据Spring Boot docs,Gradle 4.5 及更早版本的正确配置是
dependencies
compileOnly group: 'org.springframework.boot', name: 'spring-boot-configuration-processor'
// ...
【讨论】:
【参考方案11】:对于使用 Maven 或 Gradle 的用户,只需添加对 spring-boot-configuration-processor 的依赖即可。
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Gradle 4.5 及更早版本
dependencies
compileOnly "org.springframework.boot:spring-boot-configuration-processor"
Gradle 4.6 及更高版本
dependencies
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
更多信息: “使用注释处理器生成您自己的元数据” https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/appendix-configuration-metadata.html#configuration-metadata-annotation-processor
【讨论】:
【参考方案12】:对于那些使用 maven 的人,Intellij 仍然对添加依赖项不满意。好像通过maven-compiler-plugin
添加annotationProcessorPaths
终于驯服了野兽。
确保 version
与您的 spring 依赖项匹配。我怀疑它已经存在于您的有效 POM 中。
原因:我使用了一个自定义的 parent-pom,它在 annotationProcessorPaths
中设置了一个 mapstruct 注释处理器,这实际上触发了 IntelliJ 要求手动指定所有其他注释处理器。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.4.RELEASE</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
【讨论】:
显然mapstruct要求我们在annotationProcessorPaths
中特别提到mapstruct,当我们开始手动指定它们时,我们还必须手动添加spring-boot-configuration-processor、lombok等。至少这就是 intellij 想要的
谢谢! Intellij 在显示错误时显示link to the spring boot docs,但没有提及在 maven-compiler-plugin 中配置 annotationProcessorPaths
请不要在 Maven 中使用硬编码版本。继承,所以升级SpringBoot时只需要改一次:您必须在主类中提及您要使用@ConfigurationProperties 注释的类,如下所示。
@EnableConfigurationProperties(AppProperties.class)
带有@ConfigurationProperties 的属性配置类会是这样的
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "app")
public class AppProperties
String name;
String id;
Main 类会是这样的
import com.auth2.demo.config.AppProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class DemoApplication
public static void main(String[] args)
SpringApplication.run(DemoApplication.class, args);
【讨论】:
【参考方案14】:Spring 的网站上有一个教程,其中包含如何使其工作的精彩说明。只需按照下面“配置属性”部分下的步骤操作即可。
它具有此处未提及其他答案的步骤之一:
手动运行./gradlew kaptKotlin
。
截至 2021 年 3 月,IDEA 仍将在 Kotlin 属性类的顶部显示警告,但这些属性将被识别并正常工作。您将能够从 .properties
文件导航到 Kotlin 属性类,但反之则不行。
https://spring.io/guides/tutorials/spring-boot-kotlin/ 向下滚动到“配置属性”部分。
或 GitHub 上的同一页面:
https://github.com/spring-guides/tut-spring-boot-kotlin/blob/master/README.adoc#configuration-properties
【讨论】:
以上是关于@ConfigurationProperties Spring Boot 配置注释处理器在类路径中找不到的主要内容,如果未能解决你的问题,请参考以下文章
@ConfigurationProperties与@Value区别
Spring:@ConfigurationProperties 中的@NestedConfigurationProperty 列表
@ConfigurationProperties与@Value区别
@ConfigurationProperties和@EnableConfigurationProperties配合使用