deinspanjer
deinspanjer

Reputation: 515

How to write a Spring Boot YAML configuration with nested JSON?

I have been using Spring Boot applications with YAML for the external configuration, and this has been working very well so far. A toy example:

@Component
@ConfigurationProperties
class MyConfig {
  String aaa;
  Foo foo;

  static class Foo {
    String bar;
  }
}

And then a yaml file with the following properties:

aaa: hello
foo.bar: world

My problem is that I really need to add a JsonObject into my configuration. I first tried adding it as a field in the MyConfig class, and then writing the following YAML file which I believe is syntactically valid:

aaa: hello
from:
  {
    "first_initial": "D",
    "last_initial": "E"
  }
foo.bar: world

Spring threw the following error with that: Cannot access indexed value in property referenced...

I finally resorted to making the value a plain string instead and using the > folding tag to put it in the YAML, but this means I have to manually parse the string into a JsonObject in my code.

Anyone have an idea for how to do this?

Upvotes: 0

Views: 2086

Answers (1)

Strelok
Strelok

Reputation: 51451

This should work:

@Component
@ConfigurationProperties
class MyConfig {
  String aaa;
  Foo foo;
  String from;
  static class Foo {
    String bar;
  }
  // ... getters setters

  public JsonObject getFromAsJson() {
    // create object from "this.from"
  }
}

aaa: hello
foo: 
  bar: world
from: |
    {
      "first_initial": "D",
      "last_initial": "E"
    }

and this:

aaa: hello
foo: 
  bar: world
from: "{\"first_initial\": \"D\", \"last_initial\": \"E\"}"

The first version would preserve line breaks.

Upvotes: 1

Related Questions