@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-pluginoptional 行和compileJava.dependsOn(processResources),得到了 IntelliJ IDEA 2017.3。尝试在 Gradle 中运行clean 任务,然后是Refresh allBuild,仍然没有。有什么想法吗?【参考方案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时只需要改一次:$project.parent.version 我的父项目不是spring boot父POM。所以这有点 YMMV。【参考方案13】:

您必须在主类中提及您要使用@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配合使用

为啥要弃用 @ConfigurationProperties 中的方法位置?

SpringBoot 2 无法绑定 ConfigurationProperties