How to prevent Spring Boot from parsing YAML keys

2019-06-21 14:51发布

问题:

I have a YAML configuration file with a map of properties:

properties:
  a.b.c: 1

Boot will parse this as:

{a:{b:{c:1}}}

However, what I desire is :

{'a.b.c': 1}

Is there anyway to coax it into "pass through" key mode? Quoting the key doesn't seem to help.


Update

Actual example below.

Java

import static com.google.common.collect.Maps.newLinkedHashMap;

import java.util.Map;
import javax.annotation.PostConstruct;

import lombok.Data;
import lombok.val;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
@ConfigurationProperties("hadoop")
public class HadoopProperties {

   private Map<Object, Object> properties = newLinkedHashMap();

}

YAML

application.yml:

hadoop:
   properties:
      fs.defaultFS: hdfs://localhost:8020
      mapred.job.tracker: localhost:8021

Result

Calling toString() on the resulting object:

HadoopProperties(properties={fs={defaultFS=hdfs://localhost:8020}, mapred={job={tracker=localhost:8021}}})

回答1:

I see. It's because you are binding to a very generic object, so Spring Boot thinks your period separators are map key dereferences. What happens if you bind to Map or Properties?