== @ConfigurationProperties vs @Value, same application, same application.yaml == $ curl -s localhost:8080/diag/bound { "mail": { "host": "smtp.example.com", "port": 587, "timeout": "PT45S", "retries": { "maxAttempts": 5, "backoff": "PT1.5S" }, "recipients": [ "ops@example.com", "oncall@example.com" ], "headers": { "X-Env": "demo", "X-Team": "platform" } }, "validated": { "name": "demo-service", "port": 8443, "endpoint": "https://api.example.com", "pool": { "size": 25 } }, "fromValueAnnotation": { "host": "smtp.example.com", "port": 587, "timeout": "PT45S", "recipients": [], "poolSize": 25, "computedThreads": 4 } } demo.mail.recipients is a YAML block list. The binder produced both elements. @Value produced an empty list -- placeholder resolution has no concept of a YAML sequence, so ${demo.mail.recipients:} fell through to its own empty default. == the same list written as a comma-separated string, at higher precedence == $ ./scripts/run.sh "" --demo.mail.recipients=x@e.com,y@e.com,z@e.com binder : ['x@e.com', 'y@e.com', 'z@e.com'] @Value : ['x@e.com', 'y@e.com', 'z@e.com'] Both see it. A comma-separated string is the one list shape @Value understands, and the command-line source outranks the YAML file for the binder as well. == where did that value come from? == $ curl -s 'localhost:8080/diag/origin?name=demo.mail.recipients' { "property": "demo.mail.recipients", "effectiveValue": "x@e.com,y@e.com,z@e.com", "candidatesInPrecedenceOrder": [ { "source": "SimpleCommandLinePropertySource {name='commandLineArgs'}", "value": "x@e.com,y@e.com,z@e.com", "origin": "\"demo.mail.recipients\" from property source \"commandLineArgs\"" } ], "shadowedBy": null } $ curl -s 'localhost:8080/diag/origin?name=demo.mail.host' { "property": "demo.mail.host", "effectiveValue": "smtp.example.com", "candidatesInPrecedenceOrder": [ { "source": "OriginTrackedMapPropertySource {name='Config resource 'class path resource [application.yaml]' via location 'optional:classpath:/''}", "value": "smtp.example.com", "origin": "class path resource [application.yaml] from configuration-properties-1.0.0.jar - 15:11" } ], "shadowedBy": null }