Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sping-Boot Config: How to keep whitespace in yaml key being used to populate Map<String, String>

Let's say we have a configuration properties class:

@ConfigurationProperties(prefix = "whitespace.test")
public class WhitespaceTestConfig {

    private Map<String, String> configs;

    public Map<String, String> getConfigs() {
        return configs;
    }

    public void setConfigs(Map<String, String> configs) {
        this.configs = configs;
    }
}

and we try to configure it with a key with space included in it:

whitespace.test.configs:
  Key With Whitespace: "I am a value with whitespace in it"

Seems as through spring can parse this yaml fine, and it is apparently valid yaml. However, spring (SnakeYaml?) removes the spaces in the Key string:

KeyWithWhitespace -> I am a value with whitespace in it

An easy solution is to designate a special character for space and replace it within the application, but I was wondering if spring already handled this in some fashion? Perhaps there is a way to escape a space in the config in such a way that spring (SnakeYaml?) knows the we want to keep it, or perhaps there is a way to configure this?

For the sake of completeness I've tried using single and double quotations as well as \s \b.

Update:

After some additional research I found an example from SnakeYaml repository that seems to indicate that what I'm looking for should be possible: https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-block-mappings

Specifically this example:

# YAML
base armor class: 0
base damage: [4,4]
plus to-hit: 12
plus to-dam: 16
plus to-ac: 0
# Java
{'plus to-hit': 12, 'base damage': [4, 4], 'base armor class': 0, 'plus to-ac': 0, 'plus to-dam': 16}

In the example the spaces persist in the keys. Unfortunately, I'm at a loss with regard to figuring out where the whitespace is actually getting removed.

like image 293
MochiJump Avatar asked Sep 04 '19 21:09

MochiJump


People also ask

How do I Map YAML properties in spring boot?

How to Inject a Map From a YAML File. Spring Boot has taken data externalization to the next level by providing a handy annotation called @ConfigurationProperties. This annotation is introduced to easily inject external properties from configuration files directly into Java objects.

Are spaces allowed in YAML?

The suggested syntax for YAML files is to use 2 spaces for indentation, but YAML will follow whatever indentation system that the individual file uses. Indentation of two spaces works very well for SLS files given the fact that the data is uniform and not deeply nested.

How do you represent a Map in YAML?

In YAML, maps are represented using the colon ( : ) character. We can also use quotation marks ( " or ' ) to enclose the keys and values if we need to.


2 Answers

For map keys with special characters you need to surround the key with '[]' for the key to be used as specified.

So, in your case it will be

whitespace.test.configs:
  '[Key With Whitespace]': "I am a value with whitespace in it"
like image 104
javachip Avatar answered Oct 21 '22 16:10

javachip


The new binder is much stricter about property names which means you need to surround them in square brackets. Try the following:

shiro:
  testMap:
    "[/test1]": test1
    "[/test2]": test2
like image 41
Mohit Sharma Avatar answered Oct 21 '22 14:10

Mohit Sharma