I'm trying to make a configuration data class
in Kotlin with Spring Boot. I have the following class:
@Configuration
@ConfigurationProperties(prefix = "spring.braintree")
data class BraintreeConfigProperties(
val merchantId: String = "",
val publicKey: String = "",
val privateKey: String = "",
val environment: Environment = Environment.SANDBOX
)
And the following properties:
spring.braintree.merchantId=${BRAINTREE_MERCHANT_ID}
spring.braintree.publicKey=${BRAINTREE_PUBLIC_KEY}
spring.braintree.privateKey=${BRAINTREE_PRIVATE_KEY}
When I run the application I get the following exception:
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.braintree' to com.x.ps.config.BraintreeConfigProperties$$EnhancerBySpringCGLIB$$311e0531:
Property: spring.braintree.merchant-id
Value: ${BRAINTREE_MERCHANT_ID}
Origin: class path resource [application.properties] - 5:29
Reason: java.lang.IllegalStateException: No setter found for property: merchant-id
Action:
Update your application's configuration
However, I also have a class which is exactly the same as the BraintreeConfigProperties
class. This class (DatabaseConfigProperties
) does work. They are completely identical.
What I've tried:
- Checked if the property names actually match with the configuration names.
- Tried all three configuration properties separately.
- Attached a non environment variable with value 1234 to the merchantId property which results in the following exception:
APPLICATION FAILED TO START
***************************
Description:
Failed to bind properties under 'spring.braintree' to com.x.ps.config.BraintreeConfigProperties$$EnhancerBySpringCGLIB$$62509e61:
Property: spring.braintree.merchant-id
Value: 1234
Origin: class path resource [application.properties] - 5:29
Reason: java.lang.IllegalStateException: No setter found for property: merchant-id
Action:
Update your application's configuration
CodePudding user response:
The proplem here ist that val
is final and var
can be changed. So you should change your properties to var
.
More Info here: https://medium.com/mindorks/kotlin-series-val-vs-var-difference-android-kotlin-ecad780daeb7