首页 > 解决方案 > Spring boot 配置和配置属性的问题

问题描述

我有一个像下面这样的课

@Configuration
@ConfigurationProperties(prefix = "myConfig")
class MyConfig {
    lateinit var baseUrl: String
    var connectionTimeout: Int = 2000
    var defaultMaxHotels: Int = 10000
    var clientId: String = "my-domain"
    var applicationId: String = "my-app"
    var failureRateThreshold: Float = 20f
    var windowSize: Int = 100
    var minNumberOfCalls: Int = 100
    var waitDurationInOpenState: Long = 30_000

    @Bean
    fun myCircuitBreaker(): CircuitBreaker {

        var configuration = CircuitBreakerConfig.custom().failureRateThreshold(failureRateThreshold)
                            .slidingWindow(windowSize, minNumberOfCalls, CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
                            .waitDurationInOpenState(Duration.ofMillis(waitDurationInOpenState))
                            .enableAutomaticTransitionFromOpenToHalfOpen()
                            .build()

        val registry = CircuitBreakerRegistry.of(configuration)
        return registry.circuitBreaker("my-cb")

    }

当我启动我的应用程序时,它给出了一个错误提示

 An exception occurred while running. null: InvocationTargetException: Found @Configuration and @ConfigurationProperties on com.my.api.config.client.MyConfig.

请帮我解决问题。

标签: javaspring-bootkotlin

解决方案


@Configuration&@ConfigurationProperties两者不能同时应用于一个类型。但是,您可以通过以下两种方式实现您的目标

@ConfigurationProperties在课堂@Bean上使用@Configuration

application.properties

config.circuit-breaker.connection-timeout=2000
config.circuit-breaker.clientId=clientId

CircuitBreaker

public class CircuitBreaker {

    private int connectionTimeout;

    private String clientId;

    // no-args constructor

    // getters/setters
}

CircuitBreakerConfiguration

@Configuration
public class CircuitBreakerConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "config.circuit-breaker")
    public CircuitBreaker circuitBreaker() {

        return new CircuitBreaker();
    }
}

分开@ConfigurationProperties&@Configuration

application.properties

config.circuit-breaker.connection-timeout=2000
config.circuit-breaker.clientId=clientId

CircuitBreakerConfigurationProperties

@ConfigurationProperties(prefix = "config.circuit-breaker")
public class CircuitBreakerConfigurationProperties {

    private int connectionTimeout;

    private String clientId;

    // no-args constructor

    // getters/setters
}

CircuitBreaker

public class CircuitBreaker {

    private int connectionTimeout;

    private String clientId;

    // no-args constructor

    // getters/setters
}

CircuitBreakerConfiguration

@Configuration
public class CircuitBreakerConfiguration {

    @Bean
    public CircuitBreaker circuitBreaker(
        CircuitBreakerConfigurationProperties circuitBreakerConfigurationProperties) {

        final CircuitBreaker circuitBreaker = new CircuitBreaker();
        circuitBreaker.setClientId(circuitBreakerConfigurationProperties.getClientId());
        circuitBreaker
            .setConnectionTimeout(circuitBreakerConfigurationProperties.getConnectionTimeout());

        return circuitBreaker;
    }
}

推荐阅读