【问题标题】:Spring Boot Configuration Processor, Duplicate @ConfigurationProperties definition for prefixSpring Boot 配置处理器,前缀的重复 @ConfigurationProperties 定义
【发布时间】:2018-01-27 07:40:47
【问题描述】:

在 Spring Boot 应用程序中,我想使用具有相同前缀的 @ConfigurationProperties 注释来根据配置文件配置我的两个数据源。为什么 Spring Boot 配置处理器禁止它? gradle报错是:

...
:compileJava ... error: Duplicate `@ConfigurationProperties` definition for prefix 'spring.datasource'

注意事项:

  • “Run As->Spring Boot App”在 STS 中工作
  • 没有 spring-boot-configuration-processor 依赖,gradle build 可以工作(但出现警告When using @ConfigurationProperties it is recommended to add 'spring-boot-configuration-processor' to your classpath to generate configuration metadata

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

repositories {
    mavenCentral()
    maven { url "https://repository.jboss.org/nexus/content/repositories/releases" }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile 'org.springframework.boot:spring-boot-configuration-processor:1.5.4.RELEASE'
    compile("com.h2database:h2")
}

application.properties

spring.datasource.driverClassName = org.h2.Driver
spring.datasource.username = sa
spring.datasource.password = sa

你好.应用程序

@SpringBootApplication
public class Application {

    public static void main(final String[] args) {
        final SpringApplication app = new SpringApplication(Application.class);
        app.setAdditionalProfiles("prod");
        app.run();
    }

    @Bean
    @Profile("dev")
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSourceDev() {
        return DataSourceBuilder
                .create()
                .url(generateDevUrl())
                .build();
    }

    @Bean
    @Profile("prod")
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSourceProd() {
        return DataSourceBuilder
                .create()
                .url(generateProdUrl())
                .build();
    }

}

提前致谢

【问题讨论】:

  • 那些 bean 完全一样,你为什么需要那个配置?!
  • 我的生产代码比较复杂。我把它简化得太多了。我刚刚更新了我的示例代码。
  • 尽管如此,你看起来仍然在做你不应该做的事情。你为什么需要这个?恕我直言,主要问题是您有不同的方法来生成 URL。但这是你不应该在代码中但在配置中拥有的东西。
  • 我遇到了同样的问题。这种设置使用 intelij 有效,但是一旦我尝试使用 gradle 编译它就会引发错误。 “错误:重复...”你有解决办法吗?

标签: java spring spring-boot spring-boot-configuration


【解决方案1】:

我认为您对它的工作原理感到困惑。代码应该大部分保持不变。当您定义启动时要加载的配置文件时,属性会发生变化。

application-dev.properties

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.url=

应用程序-prod.properties

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.url=

而且只有一个 bean 设置了数据源。

【讨论】:

  • 数据源没问题,这不是一个很好的例子。我的问题更笼统:我想创建多个 bean,它们具有在 application.properties 中定义的一些公共属性、在 application-<profile>.properties 中定义的一些配置文件特定属性以及一些必须编程的“运行时属性”。我想使用@ConfigurationProperties 来处理公共和配置文件的具体属性(以避免在我的@Configuration 类中有多个@Value 标签和setProp()
猜你喜欢
  • 2020-08-05
  • 2018-07-27
  • 2017-08-07
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多