Search code examples
javaspringspring-bootenumsspring-properties

Spring Boot bind @Value to Enum case insensitive


Enum

public enum Property {
    A,
    AB,
    ABC;
}

Field

@Value("${custom.property}")
protected Property property;

application.properties (lower case)

custom.property=abc

When I'm running application I have an error:

Cannot convert value of type [java.lang.String] to required type [com.xxx.Property]: no matching editors or conversion strategy found.

Whereas (upper case):

custom.property=ABC

Works fine.

Is there a way to bind the value case insensitive? Like ABC, Abc, AbC, abc any pattern should work.

NOTE: I saw this question - Spring 3.0 MVC binding Enums Case Sensitive but in my case I have over 10 enums/values (and expect to have more) classes and to implement 10 different custom property binders would be painful, I need some generic solution.


Solution

  • @Value and @ConfigurationProperties features do not match. I couldn't stress enough how @ConfigurationProperties is superior.

    First, you get to design your configuration in a simple POJO that you can inject wherever you want (rather than having expressions in annotation that you can easily break with a typo). Second, the meta-data support means that you can very easily get auto-completion in your IDE for your own keys.

    And finally, the relaxed binding described in the doc only applies to @ConfigurationProperties. @Value is a Spring Framework feature and is unaware of relaxed binding. We intend to make that more clear in the doc.

    TL;DR abc works with @ConfigurationProperties but won't with @Value.