Home > front end >  Spring no setter found for property
Spring no setter found for property

Time:02-16

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:

  1. Checked if the property names actually match with the configuration names.
  2. Tried all three configuration properties separately.
  3. 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

  • Related