quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.

Home Page:https://quarkus.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Spring @ConfigProperties bindings are not relaxed

ntrp opened this issue · comments

Describe the bug
When defining properties with kebab case and defining pojos in camel case, the properties are not binded. The preferred behavior would be like described here: Relaxed Binding

Expected behavior
I defined a property named:
prop.name-with-dash
and a class:

@Data
@ConfigurationProperties(prefix = "prop")
public class MyProps {
   private String nameWithDash;
}

The property gets loaded correctly.

Actual behavior
The application fails with:
javax.enterprise.inject.spi.DeploymentException: No config value of type [java.lang.String] exists for: prop.nameWithDash

To Reproduce
The issue is pretty straightforward that's why I am not attaching a project, if really needed let me know and I will add one.

Configuration

# Add your application.properties here, if applicable.
prop.name-with-dash=value

Environment (please complete the following information):

  • Output of uname -a or ver: Linux host 5.8.10-arch1-1 #1 SMP PREEMPT Thu, 17 Sep 2020 18:01:06 +0000 x86_64 GNU/Linux
  • Output of java -version: openjdk version "11.0.8" 2020-07-14
  • GraalVM version (if different from Java):
  • Quarkus version or git rev: 1.8.1.final
  • Build tool (ie. output of mvnw --version or gradlew --version): Apache Maven 3.6.3 (NON-CANONICAL_2019-11-27T20:26:29Z_root)

I don't think relaxed binding is possible, given properties names have to be known at build time...
The default for spring-boot extension should rather be kebab case given it's "recommended for use in .properties and .yml files" in the docs.
Maybe quarkus.arc.config-properties-default-naming-strategy could be used when needing to switch to camelCase/verbatim ?
The limitation of not mixing strategies would have to be documented.
There's no strategy in Quarkus for "underscore notation", but I doubt it's used a lot.

Fair enough about relaxed binding but then would be great letting the user decide which kind of binding to use. I don't think quarkus.arc.config-properties-default-naming-strategy is used in this case since the default is kebab-case and it is using the exact name of the property to bind.

Makes sense. I'll fix it.